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

页面导航:首页 > 软件编程 > java > 从头认识java-17.4 详解同步(2)-详解竞争条件

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

来源: 作者: 时间:2016-01-15 15:14 【

这一章节我们来详细讨论一下竞争条件。1 为什么会引起竞争条件?由于操作缺失原子性。2 什么是原子性?所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一

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

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

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

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

Tags:

相关文章

    文章评论

    最 近 更 新
    热 点 排 行
    Js与CSS工具
    代码转换工具
    
    <