volatile关键字分析

volatile:

volatile通常被比喻成”轻量级的synchronized

特性:可见性,有序性。

1:可见性:可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值

原理:如果一个变量被volatile所修饰的话,在每次数据变化之后,其值都会被强制刷入主存。而其他处理器的缓存由于遵守了缓存一致性协议,也会把这个变量的值从主存加载到自己的缓存中。这就保证了一个volatile在并发编程中,其值在多个缓存中是可见的。

有序性:volatile禁止指令重排没,保证变量的赋值操作的顺序与程序代码中的执行顺序一致。

指定重排:指令重排序是程序顺序和执行的顺序不一致,重排序的对象是指令;
* 是编译器处于性能考虑,在不影响程序(单线程程序)正确性的条件下进行重新排序;
* 指令重排序不是必然发生的,指令重排序会导致线程安全问题。
* 不影响单线程:尽管指令的执行顺序可能没有完全按照程序顺序执行,但是由于指令的执行结果的提交(反应到寄存器和内存中),仍然是按照程序顺序来的,因此处理器的指令重排序并不会对单线程的正确性产生影响。指令重排序不会对单线程程序的正确性产生影响,但他可能导致多线程程序出现非预期结果。

原理:通过插入内存屏障禁止在内存屏障前后的指令执行重排序优化。 内存屏障另外一个作用是刷新出各种CPU的缓存数,因此任何CPU上的线程都能读取到这些数据的最新版本。

内存屏障(Memory Barrier)又称内存栅栏,是一个CPU指令,它的作用有两个:

  • 保证特定操作的顺序
  • 保证某些变量的内存可见性(利用该特性实现volatile的内存可见性)

应用分析:只能保证数据的可见性,有序性,一个线程在修改变量的时候,另一个线程能准确读到变量。但是不能保证原子性操作。多个线程同时写这个变量的时候会出错,比如多个线程中只有一个线程修改变量,其他线程读这个读变量,这时候用volitile声明关键字会提高效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值