竞态条件与临界区
原文来自:http://ifeve.com/race-conditions-and-critical-sections/
首先回答什么是竞态条件?
当多个线程访问同一资源,对访问顺序敏感,就称为竞态条件。
什么是临界区?
导致竞态条件发生的代码区称作临界。
private int count = 0; void add(long value){ count = count +value; }
当两个线程访问add()时
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
那么这里的结果就不是我们期待的5而是3.
这里我们也就知道为什么需要同步。