竞态条件与临界区

原文来自: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.

这里我们也就知道为什么需要同步。

posted @ 2016-12-28 10:07  冰镇矿泉水  阅读(139)  评论(0编辑  收藏  举报