从头认识java-17.4 具体解释同步(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之间的时间控制的,时间越长,误差出现的概率越高。
总结:这一章节主要具体讨论了竞争条件。
这一章节就到这里,谢谢。
-----------------------------------
从头认识java-17.4 具体解释同步(2)-具体解释竞争条件的更多相关文章
- java的(PO,VO,TO,BO,DAO,POJO)解释
java的(PO,VO,TO,BO,DAO,POJO)解释 O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定, ...
- java的(PO,VO,TO,BO,DAO,POJO)解释1
java的(PO,VO,TO,BO,DAO,POJO)解释 O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定 ...
- 关于VO、PO的理解——java的(PO,VO,TO,BO,DAO,POJO)解释
O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据. 在O/R Mapping的世界里,有 ...
- 简单测试Java线程安全中阻塞同步与非阻塞同步性能
摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>13.2.2 线程安全的实现方法 1.名词解释 同步是指锁哥线程并发访问共享数据时,保证共享数据同一时刻只被一个线程访 ...
- Java并发编程(您不知道的线程池操作), 最受欢迎的 8 位 Java 大师,Java并发包中的同步队列SynchronousQueue实现原理
Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchan ...
- java 8 - java 17 升级指北
2014年发布的java SE 8和2017年发布的java EE 8,至今还是使用最广泛的java版本,大部分java开发者对于java 8之后的升级总是敬而远之,这跟java 9以后的破坏性升级和 ...
- Java线程:线程的同步-同步方法
Java线程:线程的同步-同步方法 线程的同步是保证多线程安全访问竞争资源的一种手段. 线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问 ...
- (转)Java线程:线程的同步与锁
Java线程:线程的同步与锁 一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Fo ...
- Java多线程之线程的同步
Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同 ...
- Java代码质量改进之:同步对象的选择
在Java中,让线程同步的一种方式是使用synchronized关键字,它可以被用来修饰一段代码块,如下: synchronized(被锁的同步对象) { // 代码块:业务代码 } 当synchro ...
随机推荐
- 【树莓派】【转载】Raspberry Pi (树莓派)折腾记
在网上看到一篇对树莓派折腾记录比较详细的文章,时间比较早,但是有些东西没变. 对于新手而言,还是有点参考价值.文章参见:http://skypegnu1.blog.51cto.com/8991766/ ...
- 常见Style 对象属性值
Style对象的主要需要关注的属性分为4类,下面分别介绍下: Background 属性 backgroundColor 属性设置元素的背景颜色 Object.style.backgroundColo ...
- JDBC数据库编程:callableStatement接口
了解MySQL存储过程建立, 了解存储过程中参数传递的三种方式 了解callablestatement调用存储过程操作. 因为在现在开发中,使用存储过程的地方越来越少,所以,对于存储过程使用,只需要了 ...
- struts2配置默认Action
作用:当一个请求无法匹配到任何一个struts的action时,可以配置一个默认Action 例如:当请求路径不正确时,跳转到一个404.jsp页面 <package extends=" ...
- 用MyEclipse10.0远程连接Mysql数据库服务器
说明:本文档所有的操作均在满足以下条件的情况下操作, A.远程Linux服务器已经安装好MySQL数据库 B.本地电脑可以ping通远程服务器 C.已经成功安装了Myeclipse 一.下载mysql ...
- wcf json asp.net json
function BindNewsTypeTree() { var parentid; // $.getJSON(serviceUrl + "NewsTypeService.svc/GetN ...
- 解决 TextMate 2 无法安装 Emmet 插件
本篇文章由:http://xinpure.com/solving-textmate-2-cannot-install-emmet-plugin/ 前端神器 Emmet 插件原名为 ZedCoding ...
- 将XML格式的字符串封装成DOM对象
在java端将字符串转化为xml对象可以使用DocumentHelper.parseText(xmlReturn).getRootElement(); 在js中同样有方法可以将字符串转化为xml对象, ...
- python-创建一个本地txt文本
def text_create(name, msg): desktop_path = '/Users/Hou/Desktop/' full_path = desktop_path + name + ' ...
- git教程,切换分支并拉去
进了目录切换分支: git checkout 5.1 切换完成后拉去分支为: git pull https://www.liaoxuefeng.com/wiki/0013739516305929606 ...