多线程 竞态条件与临界区
来源:互联网 发布:淘宝装修代码怎么使用 编辑:程序博客网 时间:2024/05/22 19:31
竞态条件与临界区
在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,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()方法就是一个临界区,它会产生竞态条件。在临界区中使用适当的同步就可以避免竞态条件。
转载:http://ifeve.com/race-conditions-and-critical-sections/
阅读全文
0 0
- 多线程 竞态条件与临界区
- 竞态条件与临界区
- 竞态条件与临界区
- java竞态条件与临界区
- 竞态条件与临界区
- 竞态条件与临界区
- 竞态条件与临界区
- 并发编程五:竞态条件与临界区
- Java并发系列-6、竞态条件与临界区
- java并发-竞态条件与临界区(3)
- 多线程与临界区
- 多线程系列:竞态临界区、共享资源
- JAVA 并发编程随笔【六】线程的竞态条件与临界区
- 8.竞态条件和临界段
- 多线程CreateThread与临界区Create…
- 多线程-临界区模式
- 多线程临界区编程
- VC多线程临界区
- 心情
- cocos2dx lua 再谈实现EditBox输入框
- java.util.concurrent.Executors 类
- fatal error C1083: Cannot open include file: 'streambuf': No such file or directory解决方案
- java异常处理的五个关键字
- 多线程 竞态条件与临界区
- Java反射
- linux基础(十三)软件安装rpm和yum
- 这是博客开通的时刻
- 结构体难点总结
- Android studio 快捷键使用
- Just another Robbery LightOJ
- 实验二线性表综合实验-顺序表
- 69道Spring面试题和答案