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

8、Java并发性和多线程-静态条件与临界区

以下内容转自http://ifeve.com/race-conditions-and-critical-sections/:

在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。实际上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源就是安全的。

多线程同时执行下面的代码可能会出错:

public class Counter {
    protected long count = 0;
    public void add(long value){
        this.count = this.count + value;   
    }
}

想象下线程A和B同时执行同一个Counter对象的add()方法,我们无法知道操作系统何时会在两个线程之间切换。JVM并不是将这段代码视为单条指令来执行的,而是按照下面的顺序:

从内存获取 this.count 的值放到寄存器
将寄存器中的值增加value
将寄存器中的值写回内存

观察线程A和B交错执行会发生什么:

  this.count = 0;
A:读取 this.count 到一个寄存器 (0)
B:读取 this.count 到一个寄存器 (0)
B:将寄存器的值加2
B:回写寄存器值(2)到内存. this.count 现在等于 2
A:将寄存器的值加3
A:回写寄存器值(3)到内存. this.count 现在等于 3

两个线程分别加了2和3到count变量上,两个线程执行结束后count变量的值应该等于5。然而由于两个线程是交叉执行的,两个线程从内存中读出的初始值都是0。然后各自加了2和3,并分别写回内存。最终的值并不是期望的5,而是最后写回内存的那个线程的值,上面例子中最后写回内存的是线程A,但实际中也可能是线程B。如果没有采用合适的同步机制,线程间的交叉执行情况就无法预料。

竞态条件&临界区

当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。上例中add()方法就是一个临界区,它会产生竞态条件。在临界区中使用适当的同步就可以避免竞态条件。

==>如有问题,请联系我:easonjim#163.com,或者下方发表评论。<==

相关文章:

  • 区块链101:以太智能合同如何运作?
  • 初试Code First(附Demo)
  • 我的面试准备过程--容器(更新中)
  • js中 size和length的区别
  • 【转】mysql锁表解决方法
  • angularjs之filter过滤器
  • 一起来玩AZURE SQL(一)AZURE SQL 介绍
  • 内核线程、轻量级进程、用户线程三种线程概念解惑(线程≠轻量级进程)【转】...
  • 试用友盟SDK实现Android分享微信朋友圈
  • 程序员书单【持续更新】
  • 烂代码传奇
  • Docker的安装和测试
  • React-Native - 收藏集 - 掘金
  • java基础-数组的折半查找原理
  • Ubuntu设置屏幕分辨率
  • 【刷算法】从上往下打印二叉树
  • AWS实战 - 利用IAM对S3做访问控制
  • ES6之路之模块详解
  • Linux后台研发超实用命令总结
  • MaxCompute访问TableStore(OTS) 数据
  • opencv python Meanshift 和 Camshift
  • Python利用正则抓取网页内容保存到本地
  • SAP云平台里Global Account和Sub Account的关系
  • Vim 折腾记
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 翻译:Hystrix - How To Use
  • 基于组件的设计工作流与界面抽象
  • 排序算法学习笔记
  • 设计模式(12)迭代器模式(讲解+应用)
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 因为阿里,他们成了“杭漂”
  • 用 Swift 编写面向协议的视图
  • 鱼骨图 - 如何绘制?
  • 从如何停掉 Promise 链说起
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​你们这样子,耽误我的工作进度怎么办?
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #vue3 实现前端下载excel文件模板功能
  • (1)虚拟机的安装与使用,linux系统安装
  • (12)Hive调优——count distinct去重优化
  • (zt)最盛行的警世狂言(爆笑)
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)计算机毕业设计高校学生选课系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • ***检测工具之RKHunter AIDE
  • .a文件和.so文件
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET 设计一套高性能的弱事件机制
  • .Net7 环境安装配置
  • .NET连接数据库方式
  • @Bean, @Component, @Configuration简析
  • @SpringBootApplication 包含的三个注解及其含义
  • [2018-01-08] Python强化周的第一天