博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程--内存可见性&&原子性
阅读量:5916 次
发布时间:2019-06-19

本文共 1274 字,大约阅读时间需要 4 分钟。

早上突然想起多线程的内存可见性跟原子性!趁着脑子发热,马上写写!

说起内存可见性跟原子性,不可避免会想起几个关键字synchronized、volatile、AtomInteger;想起几个名词 指令重排序、as-if-serial语义、java八个指令。下面就详细讲解一下!内存可见性:这是一种jmm内存模型的定义。单线程情况下,所有的变量都是共享变量,内存都是可见的;但是如果使用多线程,那么就需要再各个内存中不断地刷新共享变量,

jmm下分为主内存(之前说了,“共享内存”)、工作内存。工作内存中要保留一份主内存中共享变量的副本,要保证线程之间的内存可见性也就是说每个工作内存中的变量如果发生变化,要同步到其他内存中(包括主内存跟工作内存),但是工作内存之间又不能相互通信(可以想一下为什么要有工作内存、主内存),那么就得分成两步:

1、工作内存中的变量刷新到主内存;
2、主内存共享变量将变量刷新到其他工作内存当中;

原子性:这个可以结合指令重排序跟as-if-serial语义来说。为了提高效率,cpu执行不会按照程序代码执行,比如:        int a = 1;        int b = 2;        c = a + b;指令重排序就是说cpu执行权可能执行顺序是先b再a,然后计算c;as-if-serial语义就是说不管你之前怎么变,最后要执行的一定是c = a + b;保证正确;

也就是说,代码不可在分割;比如 : num++;,这个就不是原子操作,因为他可以分解为mnumber = num + 1; num = mnumber;

为了保证内存可见性跟原子性,可以使用synchronized、volatile、AtomInteger、还有java6后新增的reentlock;volatile:可以保证可见性,也就是他会及时更新所有内存中被声明为volatile的变量,而且它不会被阻塞,所以效率上来说他比synchronized(会被阻塞)要高,

但是却保证不了原子性,就像刚刚说的 num++;有可能线程获取到的值为没有进行num++的值就直接进行了下一次的++。所以一般不对这个进行计数器的操作,原则上可以对boolean

变量、温度变化这类的场景使用,而且由于不会被阻塞,所以它比synchronized效率更好!

AtomInteger:java对于++、--等操作不是线程安全的,那么对于计数器等场景的使用,我们可以采用同步代码块的方式,同时也可以使用java提供的AtomInteger,这个保证了线程安全,而且使用方便。synchronized&&reentlock:常见的同步方式,推荐使用reetlock;这样可以保证释放掉锁,但是要注意,所有的 不管是正常或者异常的地方都要释放掉锁,所以最好是try-catch之后一定使用finally进行释放,这样就不会导致资源被占用了

转载于:https://www.cnblogs.com/kevinfuture/p/6472916.html

你可能感兴趣的文章
自定义事件
查看>>
浮点数的二进制
查看>>
主库配置关于Dataguard Online redo log 和 Standby redo log
查看>>
[内核笔记1]内核文件结构与缓存——inode和对应描述
查看>>
Red Hat忘记root密码了怎么办?
查看>>
Team Foundation Server (TFS) 2015 安装指导
查看>>
IOS-导航路线
查看>>
word2010图片仅仅显示边框
查看>>
启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法...
查看>>
数据质量及数据清洗方法
查看>>
排序算法(一)桶排法
查看>>
【POJ 1062】昂贵的聘礼(最短路)
查看>>
vim:去掉响铃
查看>>
Spring 小示例
查看>>
MySql清空表的方法介绍 : truncate table 表名
查看>>
codeforces水题100道 第四题 Codeforces Round #105 (Div. 2) A. Insomnia cure (math)
查看>>
利用 SPL 快速实现 Observer 设计模式: SplSubject 、SplObserver与SplObjectStorage【转】
查看>>
C\C++ 1A2B小游戏源码
查看>>
【SDK fix】iOS 8下将UIButton放置于tabbar位置无法响应event
查看>>
Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)...
查看>>