一、原子性

原子,一个不可再被分割的颗粒。原子性,指的是一个或多个不能再被分割的操作。
int i = 1; // 原子操作
i++; // 非原子操作,从主内存读取 i 到线程工作内存,进行 +1,再把 i 写到朱内存。
虽然读取和写入都是原子操作,但合起来就不属于原子操作,我们又叫这种为“复合操作”。
我们可以用synchronized 或 Lock 来把这个复合操作“变成”原子操作。
例子:
private synchronized void increase(){
i++;
}
或
private int i = 0;
Lock mLock = new ReentrantLock();
private void increase() {
mLock.lock();
try {
i++;
} finally{
mLock.unlock();
}
}
这样我们就可以把这个一个方法看做一个整体,一个不可分割的整体。
除此之前,我们还可以用java.util.concurrent.atomic里的原子变量类,可以确保所有对计数器状态访问的操作都是原子的。
例子:
AtomicInteger mAtomicInteger = new AtomicInteger(0);
private void increase(){
mAtomicInteger.incrementAndGet();
}
二、可见性
当多线程访问某一个(同一个)变量时,其中一条线程对此变量作出修改,其他线程可以立刻读取到最新修改后的变量。
int i = 0;
// 线程 1 执行
i++;
// 线程 2 执行
System.out.print("i=" + i);
即使是在执行完线程里的 i++ 后再执行线程 2,线程 2 的输入结果也会有 2 个种情况,一个是 0 和 1。
因为 i++ 在线程 1(CPU1)中做完了运算,并没有立刻更新到主内存当中,而线程 2(CPU2)就去主内存当中读取并打印,此时打印的就是 0。
synchronized和Lock能够保证可见性。
另外volatile关键字也可以解决这个问题(下一篇会讲到)。
三、有序性
我们都知道处理器为了拥有更好的运算效率,会自动优化、排序执行我们写的代码,但会确保执行结果不变。
例子:
int a = 0; // 语句 1 int b = 0; // 语句 2 i++; // 语句 3 b++; // 语句 4
这一段代码的执行顺序很有可能不是按上面的 1、2、3、4 来依次执行,因为 1 和 2 没有数据依赖,3 和 4 没有数据依赖, 2、1、4、3 这样来执行可以吗?完全没问题,处理器会自动帮我们排序。
在单线程看来并没有什么问题,但在多线程则很容易出现问题。
再来个例子:
// 线程 1
init();
inited = true;
// 线程 2
while(inited){
work();
}
init(); 与 inited = true; 并没有数据的依赖,在单线程看来,如果把两句的代码调换好像也不会出现问题。
但此时处于一个多线程的环境,而处理器真的把这两句代码重新排序,那问题就出现了,若线程 1 先执行 inited = true; 此时,init() 并没有执行,线程 2 就已经开始调用 work() 方法,此时很可能造成一些奔溃或其他 BUG 的出现。
synchronized和Lock能确保原子性,能让多线程执行代码的时候依次按顺序执行,自然就具有有序性。
而volatile关键字也可以解决这个问题,volatile 关键字可以保证有序性,让处理器不会把这行代码进行优化排序。
# Java多线程
# 并发编程
# Java并发编程示例(一):线程的创建和执行
# Java并发编程示例(六):等待线程执行终止
# Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁
# Java并发编程之栅栏(CyclicBarrier)实例介绍
# Java并发编程示例(二):获取和设置线程信息
# Java并发编程示例(七):守护线程的创建和运行
# Java并发编程示例(十):线程组
# Java并发编程总结——慎用CAS详解
# 理解Java多线程之并发编程
# 多线程
# 都是
# 可以用
# 两句
# 解决这个问题
# 单线程
# 是在
# 见性
# 会有
# 多个
# 就不
# 但在
# 很容易
# 能让
# 再来
# 很可能
# 或其他
# 就去
# 已经开始
# 写到
相关文章:
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
制作证书网站有哪些,全国城建培训中心证书查询官网?
建站之星展会模版如何一键下载生成?
做企业网站制作流程,企业网站制作基本流程有哪些?
建站主机选哪种环境更利于SEO优化?
如何用西部建站助手快速创建专业网站?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
如何快速搭建高效简练网站?
常州自助建站费用包含哪些项目?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
建站为何优先选择香港服务器?
网站企业制作流程,用什么语言做企业网站比较好?
如何通过NAT技术实现内网高效建站?
电商网站制作公司有哪些,1688网是什么意思?
北京的网站制作公司有哪些,哪个视频网站最好?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
宁波自助建站系统如何快速打造专业企业网站?
免费网站制作appp,免费制作app哪个平台好?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
大学网站设计制作软件有哪些,如何将网站制作成自己app?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
如何用低价快速搭建高质量网站?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
如何选择最佳自助建站系统?快速指南解析优劣
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
建站之星在线客服如何快速接入解答?
如何用美橙互联一键搭建多站合一网站?
建站之星2.7模板:企业网站建设与h5定制设计专题
如何快速搭建FTP站点实现文件共享?
如何通过商城自助建站源码实现零基础高效建站?
如何在Windows虚拟主机上快速搭建网站?
制作网站的模板软件,网站怎么建设?
宝塔新建站点为何无法访问?如何排查?
如何选择高性价比服务器搭建个人网站?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
成都响应式网站开发,dw怎么把手机适应页面变成网页?
如何快速搭建高效服务器建站系统?
网页设计与网站制作内容,怎样注册网站?
如何通过VPS建站实现广告与增值服务盈利?
如何通过多用户协作模板快速搭建高效企业网站?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
网站专业制作公司有哪些,做一个公司网站要多少钱?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
北京专业网站制作设计师招聘,北京白云观官方网站?
如何在IIS中新建站点并配置端口与物理路径?
*请认真填写需求信息,我们会在24小时内与您取得联系。