从头认识java-17.4 详解同步(2)-详解竞争条件

来源:互联网 发布:i排版软件 编辑:程序博客网 时间:2024/06/06 04:34

这一章节我们来详细讨论一下竞争条件。

1.为什么会引起竞争条件?

由于操作缺失原子性。


2.什么是原子性?

所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。


3.分解上一章节转账的步骤:

(1)读取某个账户的余额,对比提取的金额

if (accounts[fromAccount] < money) {return;}

(2)从A账户转出XXX元

accounts[fromAccount] -= money;


(3)从B账户转入XXX元

accounts[toAccount] += money;


4.由于不具备原子性,而且是多线程运行,因此我们可以假设:

(1)现在线程A已经执行了上面的第一第二步

(2)现在线程B启动,对同样的账户进行上面的第一第二步

(这个时候已经出错了)

(3)线程A再执行第三步

(4)线程B再执行第三步

循环....

我们上面只是列出两个线程同时工作的情况,但是我们的测试程序开了20个线程,如果现实当中可能是20000甚至2000000个线程,数据直接就乱套了。


5.步骤图:



6.更糟的情况

由于决定这个误差出现的概率是由步骤2到步骤3之间的时间控制的,时间越长,误差出现的概率越高。


总结:这一章节主要详细讨论了竞争条件。


这一章节就到这里,谢谢。

-----------------------------------

目录




1 0