您的位置:首页 > 编程语言 > Java开发

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

2016-01-11 17:33 399 查看
这一章节我们来详细讨论一下竞争条件。
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之间的时间控制的,时间越长,误差出现的概率越高。

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

这一章节就到这里,谢谢。
-----------------------------------
目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: