从头认识java-17.4 详解同步(2)-详解竞争条件
2016-01-11 17:33
399 查看
这一章节我们来详细讨论一下竞争条件。
1.为什么会引起竞争条件?
由于操作缺失原子性。
2.什么是原子性?
所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。
3.分解上一章节转账的步骤:
(1)读取某个账户的余额,对比提取的金额
(2)从A账户转出XXX元
(3)从B账户转入XXX元
4.由于不具备原子性,而且是多线程运行,因此我们可以假设:(1)现在线程A已经执行了上面的第一第二步
(2)现在线程B启动,对同样的账户进行上面的第一第二步
(这个时候已经出错了)
(3)线程A再执行第三步
(4)线程B再执行第三步
循环....
我们上面只是列出两个线程同时工作的情况,但是我们的测试程序开了20个线程,如果现实当中可能是20000甚至2000000个线程,数据直接就乱套了。
5.步骤图:
![](http://img.blog.csdn.net/20160111173119390?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
6.更糟的情况
由于决定这个误差出现的概率是由步骤2到步骤3之间的时间控制的,时间越长,误差出现的概率越高。
总结:这一章节主要详细讨论了竞争条件。
这一章节就到这里,谢谢。
-----------------------------------
目录
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之间的时间控制的,时间越长,误差出现的概率越高。
总结:这一章节主要详细讨论了竞争条件。
这一章节就到这里,谢谢。
-----------------------------------
目录
相关文章推荐
- springmvc jstl
- centeros 安装 java resin
- JAVA正则表达式-捕获组与非捕获组
- 1.7 Java类和对象的概念
- Java开发中的23种设计模式详解
- 关于Spring注解的一些说明
- 处理防盗链的img无法显示
- ConcurrentHashMap解析(JDK8)
- spring quartz学习总结: cluster的配置和示例
- java web中Jdbc访问数据库步骤通俗解释(吃饭),与MVC的通俗解释(做饭)
- 一个例子让你了解Java反射机制
- 使用Eclipse基于Maven的Spring MVC 调试心得(二)--- Spring配置
- Spring Mvc interceptor
- 【JDK源码分析】String的存储区与不可变性
- 深入理解Java虚拟机 字节码执行引擎
- Java模式
- java中文排序
- Java线程状态及Thread类中的主要方法
- java内存空间
- 【Java】————概述