volatile的使用场景
单词解释:
乱序执行:指CPU对代码的执行顺序进行乱序优化,但保证各执行代码单元的顺序按指令顺序排列。以达到充分利用处理器的各处理单元的目的。(可以理解成:一个任务有不同的执行单元,这些单元之间有一定的执行顺序,但部分执行单元可提前工作,乱序执行就是让这部分执行单元提前一段时间执行,从而提高整体的效率,减少整体执行时间)。
保证线程安全的核心要素:原子性和可见性(线程的同步机制都是围绕这两点来保证线程的安全性);
race condition(竞争条件):当两个以上线程读写某些共享数据,而最后的结果取决于进程进行的精确时序,称为竞争条件(race condition);
可见性问题出现原因:
为了协调cpu和内存读写速度巨大差异的问题,所以有了高速缓存的出现(cpu不会每次获取数据都从内存获取,而是在高速缓存中存储有拷贝),但同时产生了可见性问题(由于cpu对内存中的对象的读取并不是原子操作,所以线程a拿到的对象并不一定是线程b写入的对象,此处有乱序执行的影响,但不止此因素)。
上一篇讲了volatile的特性,如下是volatile的使用条件:
volatile只能保证操作的可见性,但无法保证操作的原子性,所以使用条件会比synchronized苛刻,如下(必须同时满足):
1.更改不依赖于当前值,或能够确保只会在单一线程中修改变量的值,如果对变量的修改依赖于现有值,就是一个race condition操作,此时就需要使用其它方式了(比如synchronized),volatile对原子性的问题发能为力。
2.变量不需要和其他变量共同参与不变约束,比如start<end ,即使start和end都被标识为volatile,但当存在多个线程同时存在时,仍存在线程安全问题:
检查start<end是否成立, 在给start赋值之前不变式是有效的。
但是如果另外的线程在给start赋值之后给end赋值之前时检查start<end, 该不变式是无效的。
volatile的典型使用场景是作为标记使用:
public class SocketThread extends Thread { public volatile boolean running = true; @Override public void run() { while (running) { // ... } }
}
------------------------------------------------------------------------------------------------------------------------------------------------
补充一篇在豆瓣上看到的文章,:
CPU与内存的中转站 ——了解CPU缓存的秘密
https://www.douban.com/note/204987800/,
其实,我觉着把“操作系统”系统学习一遍更好,不过,短期内暂时没有这本书的学习计划,往后排吧。
volatile的使用场景的更多相关文章
- 【Java线程】volatile的适用场景
http://www.ibm.com/developerworks/cn/java/j-jtp06197.html 把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性 ...
- volatile的适用场景
volatile保证线程间的数据是可见的(共享的),但不保证数据同步 volatile相当于synchronized的弱实现,也就是说volatile实现了类似synchronized的语义,却又没有 ...
- JAVA锁和volatile的内存语义&volatile的使用场景
JAVA锁的内存语义 当线程释放锁时,JMM(Java Memory Model)会把该线程对应的本地内存中的共享变量刷新到主内存中. 当线程获取锁时,JMM会将该线程对应的本地内存置为无效.从而使得 ...
- Volatile的应用场景
1.当一个变量可能会被意想不到的更新时,要使用volatile来声明该变量,告诉编译器它所修饰的变量的值可能会在任何时刻被意外的更新. 2.语法 volatile int foo; int volat ...
- volatile有什么用?能否用一句话描述volatile的应用场景
volatile保证内存可见性和禁止指令重排.volatile用于多线程环境下的单次操作(单次读或者单次写).volatile关键字不能提供原子性. volatile关键字为实例域的同步访问提 ...
- volatile 有什么用?能否用一句话说明下 volatile 的应用场景?
volatile 保证内存可见性和禁止指令重排. volatile 用于多线程环境下的单次操作(单次读或者单次写).
- java volatile关键字作用及使用场景
1. volatile关键字的作用:保证了变量的可见性(visibility).被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象.如以下代码片段,isShut ...
- 【并发编程】Volatile原理和使用场景解析
目录 一个简单列子 Java内存模型 缓存不一致问题 并发编程中的"三性" 使用volatile来解决共享变量可见性 volatile和指令重排(有序性) volatile和原子性 ...
- Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
随机推荐
- 20165223 week3蓝墨云测试总结
1. 表达式0xaa | 0x55的值为 答案: 解析: 0xaa用二进制表示为10101010,0x55用二进制表示为01010101,按位或后为11111111,十进制表示为255,十六进制表示为 ...
- Linux下搜狗输入法和快捷键Ctrl+Space冲突的解决
配置快捷键(不是搜狗的设置) 把搜狗的启动快捷键给删了(如果有两个键盘[英+中],你按Shift就可以切换了,完全没必要占着茅坑) 其他快捷键冲突在键盘里面设置 over
- 用go语言实现线程池
代码放在 https://github.com/bigben0123/workerPool 安装完go软件后.执行目录中的install.cmd即可.
- MD5加密解密类(asp.net)&使用MD5过时处理
加密类 #region ========加密======== /// <summary> /// 加密 /// </summary> /// <param name=&q ...
- Good Bye 2018 D. New Year and the Permutation Concatenation
传送门 https://www.cnblogs.com/violet-acmer/p/10201535.html 题意: 求 n 的所有全排列组成的序列中连续的 n 个数加和为 n*(n+1)/2 的 ...
- eclipse添加market ,maven
添加market 转载自http://blog.csdn.net/buptdavid/article/details/42423247 Eclipse Marketplace是个插件应用商店,很实用的 ...
- Tennis Game CodeForces - 496D(唯一分解定理,费马大定理)
Tennis Game CodeForces - 496D 通过排列组合解决问题. 首先两组不同素数的乘积,是互不相同的.这应该算是唯一分解定理的逆运用了. 然后是,输入中的素数,任意组合,就是n的因 ...
- 通过$.ajax设置预加载动画加强用户体验
以前在jquery请求数据时,总喜欢用简洁的$.get与$.post提交数据,但有时发现由于网速的问题,有些时候网站加载js获得的数据会非常慢,于是就想能不能请求数据中间,给加载数据一个提示,增加用户 ...
- memcached 在windows中的部署和使用
第一步:下载memcached 地址:http://www.121down.com/soft/softview-28366.html 第二步:将下载文件解压到文件目录后,打开命令窗口 通过cd命令 ...
- Ajax的请求规范(二)
第一种方式:send()不带参数 function doAjax(url,fnSucc,fnFaild) { //1.创建Ajax对象 if (window.XMLHttpRequest) {//判断 ...