当前位置: 首页 > news >正文

宏升温岭网站建设/百度上海总部

宏升温岭网站建设,百度上海总部,百度推广网站可以链接到同公司另一个网站吗,360全景图制作线程安全性 要编写出安全性代码,其核心在于对状态访问(实例或静态域)操作进行管理,特别是共享的和可变的状态访问。 如果当多个线程访问同一个可变的状态变量时候没有合适的同步,那么会出错: 解决&#xf…

线程安全性

要编写出安全性代码,其核心在于对状态访问(实例或静态域)操作进行管理,特别是共享的和可变的状态访问。
如果当多个线程访问同一个可变的状态变量时候没有合适的同步,那么会出错:
解决:
不在线程之间共享该状态变量;
该状态量修改不可变的变量
在访问状态量时使用同步。
1.理解线程安全性
单线程可以近似定义为:‘所见即所知’
可以这么定义线程安全性:当多个线程访问某个类时,这个类可以始终保持的正确的行为
无状态对象一定是线程安全的。
2.原子性
还记得count++这个案例吗?

priva long count = 0;
public long getCount(){
return count;
}
publuc void service (ServletRequest req,ServletResponse resp){BigInteger i= extractFromRequest(req);BigInterger[] factors = factor(i);++count;encodeIntoResponse(resp,factors);
}

很明显这是非线程安全的,这个类会丢失更新操作。
不要认为++count只是一个操作,但这个操作并非原子的,因而它并不会作为一个不可分割的操作来执行。实际上,它包含了三个独立的操作;
读取count的值,将值加1,然后将计算结果写入count。这是一个“读取-修改-写入”的操作序列。并且结果依赖于之前的状态。

怎么个不安全法:
两个线程在没有同步的情况下同时对一个计数器执行递增操作时发生的情况下。如果计数器的初始值取9,那么在某些情况下,每个线程读到的值都为9,接着执行递增操作,并且都将计数器的值设为10。显然,这不是我们希望看到的情况,如果有一次递增操作丢失了,计数器的值就将偏差1。
这种不恰当的执行时序出现不正确的结果是一种非常重要的情况:竞态条件

最常见的竞态条件类型就是**“先检查后执行”(延迟初始化)操作**,即通过一个可能失效的观测结果来决定下一步的动作
理解:观察结果的失效就是大多数竞争条件的本质—基于一种可能失效的观察结果来做出判断或者执行某个计算。
首先观察到某个条件为真(例如文件x不存在)然后根据这个观察结果采用相应的动作(创建文件x),事实上,在你观察到这个结果以及开始创建文件之间,观察结果可能变得无效(另一个线程在这期间创建了文件x),从而导致各种问题(未预期的异常。数据被覆盖、文件被破坏等)
在计数器操作中存在另一种竞态条件:在“读取-修改-写入”这种操作中,基于对象之前的状态来定义对象状态的转换。要递增一个计数器,必须知道它之前的值,并确定在执行更新的过程中没有其他线程会修改过使用这个值(狸猫换太子的意思)
复合操作
如果上面的递增情况是原子操作,竞态条件就不会发生
"先检查后执行"和“读取-修改-写入(例如递增操作)”等操作统称为复合操作:包含了一组必须以原子方式执行的操作以确保线程安全性

解决方案:
参考juc
juc的atomic包中包含了一些原子变量类,用于是现在数值和对象上的原子状态转换。这是java中用于确保原子性的内置机制
后面还有
加锁机制

内置锁
相当于互斥体(或互斥锁),这意味着最多只有一个线程能持有这种锁。当线程A尝试 获取一个由线程B持有的锁,线程A必须等待或者阻塞,知道线程B释放这个锁。如果永远不释放锁,那么A也将永远地等待下去,用synchronized来修饰方法。虽然是安全的。然而,这种方法过于极端,性能不高
内置锁是可重入的,下面这段代码不会发生死锁:

public class Widget{public synchronized void doSomething(){......}
}
public class LoggingWidget extends Widget{public synchronized void doSomething(){super.doSomething();
}
}

用锁来保护状态
只有被多个线程同时访问的可变数据才需要通过锁来保护,并不是所有数据都需要锁的保护
缓存的数值和因数分解结果都由对象的内置锁来保护
安全和性能不可兼得
在使用锁的时候,应该清楚代码块中实现的功能,以及在执行该代码块时是否需要很长的时间。无论是执行计算密集的操作,还是在只执行某个可能阻塞的操作,如果持有锁的时间过长,那么带来安全或性能问题。
当执行时间较长的计算或者可能无法快速完成的操作时(例如,网络I/O或控制台I/O),一定不要持有锁

后续。。。。。。

http://www.lbrq.cn/news/1412461.html

相关文章:

  • 开彩票网站做私庄/百度账号人工申诉
  • 什么企业需要网站建设/做企业网站建设的公司
  • 做旅游宣传图的网站有哪些/成都seo招聘
  • 网站优化靠谱/的磁力搜索引擎
  • 合肥做网站便宜/友链交换网站
  • 成都做app定制开发多少钱/石家庄seo报价
  • 江西昌宇建设工程公司网站/线上营销推广方式
  • 瑞昌建站公司/自己做网站怎么做
  • bugku中网站被黑怎么做/外贸网络推广
  • 网站动态背景欣赏/seo优化排名工具
  • wordpress 显示备案号/seo基本步骤
  • 怎样做一个简单的网站首页/宁波关键词网站排名
  • 新疆网站建设品牌/保定seo排名外包
  • 今日生猪价格表/seo在线论坛
  • 微商网站建设/2023年7月疫情爆发
  • 建设京剧网站的意义/百度推广业务员
  • 网站集约化建设讲话稿/中国域名注册官网
  • 株洲企业网站建设费用/站长素材音效
  • 帆布网站做哪个/百度框架户开户渠道代理
  • 江门企业网站建设公司/石家庄最新新闻事件
  • 帮公司做网站赚钱吗/宁波seo推广
  • 黔东南网站建设gzklyy/指数工具
  • 社交网站页面设计/危机公关处理
  • 品牌网站建设四川/企业宣传片视频
  • 小程序转换成网页/海阳seo排名优化培训
  • 网站的网络公司/广告推广软文案例
  • 网彩预测网站制作教程/在线营销推广
  • 个人php网站/免费发布活动的平台
  • 做配色的网站/天天外链官网
  • 网站开发2008/宜昌seo
  • 45 C++ STL模板库14-容器6-容器适配器-优先队列(priority_queue)
  • 数据赋能(396)——大数据——抽象原则
  • 【UEFI系列】ACPI
  • PCIE EP 框架
  • AI加持下的智能路由监控:Amazon VPC Direct Connect实战指南
  • 数据结构初阶:排序算法(二)交换排序