理解高并发(19).volatile原理及用法

功能
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");
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值