理解高并发(19).volatile原理及用法
来源:互联网 发布:海绵软件 编辑:程序博客网 时间:2024/06/05 15:52
功能
volatile关键字有2大作用,
- 保证被修饰的语句在执行和编译时不被优化
下面的例子,如果不加volatile,执行器对stop的取值仅从本地工作内存中获取,这样的话会造成即使该值被其它线程修改无无从感知。
专业点讲:禁止指令重排序
- 保证线程能够获取到最新值
如果增加volatile修饰,每次都从主存中获取,可以取到最新值.
专业点讲:保证可见性
原理
其实底层实现也很简单, 就是在指令的前面增加一个lock,也称内存(屏障)栅栏,内存栅栏能保证:
1、栅栏前面的指令不能在栅栏后面的指令之后执行
2、值修改后要求立刻被回写主存
3、在写操作时,其它线程必须等待写完成
示例源码
public class VolatileTest {
/**
* 如果 stop变量上不加volatile修饰, 程序不能正常退出
* 增加volatile修饰后, 当stop值修改后, 其它线程能够立马感知得到。
*/
private static boolean stop = false;
public static void main(String[] args) throws Exception {
Thread workThread = new workThread();
workThread.start();
TimeUnit.SECONDS.sleep(2);
System.out.println("Stop Thread");
stop = true;
}
static class workThread extends Thread{
public void run() {
int i = 0;
while (!stop) {
i++;
//如果在这增加System.out.println(); 输出,则能够正常退出
//原因是因为System.out.println 做了同步,而每次同步都会刷新一次
//内存
}
System.out.println("work thread is over");
}
}
}
阅读全文
0 0
- 理解高并发(19).volatile原理及用法
- 理解高并发(5).synchronized原理及用法
- 理解高并发(15).Future、Callable实现原理及用法
- 理解高并发(17).threadlocal原理及用法
- 并发原理及php高并发解决方案
- 理解高并发(8).可重入锁RetreenLock用法
- Java并发volatile理解
- 并发(二):理解volatile
- Volatile并发理解
- 理解高并发(11).线程通信之_join使用及原理
- Java高并发--volatile关键字
- volatile含义及用法
- 高并发网站原理
- 高并发网站原理
- java高并发:CAS无锁原理及广泛应用
- php 高并发 前端 CDN技术原理及配置
- AtomicInteger 在高并发量应用程序中的使用及volatile说明
- 高并发基础之volatile(二)
- js模块化规范
- 一个字符替换的算法
- Thinkphp 模型->快捷查询
- 文件上传Content-disposition中Attachment和inline的区别
- quartz快速入门(一)
- 理解高并发(19).volatile原理及用法
- Oracle 11g导出空表、少表的解决办法
- 2.1字符编码相关知识点简介
- CodeVS 3012 & 3037 线段覆盖4 & 5
- lcd驱动框架
- NYOJ题目36-最长公共子序列(经典动态规划题)
- shell解析命令行的过程以及eval命令
- 初识scala
- Qt+ffmpeg仿格式工厂:编程中遇到的问题(三)