码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-07-31 14:39:55      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:csdn   多线程   文件夹   xxx   name   context   tail   总结   family   

这一章节我们来具体讨论一下竞争条件。

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之间的时间控制的,时间越长,误差出现的概率越高。


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


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

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

文件夹




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

标签:csdn   多线程   文件夹   xxx   name   context   tail   总结   family   

原文地址:http://www.cnblogs.com/tlnshuju/p/7262718.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!