码迷,mamicode.com
首页 > 其他好文 > 详细

volatile与synchronized比较

时间:2018-12-18 00:08:10      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:opera   虚拟机   operator   一段   volatil   jvm   ati   无法   情况   

volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存(主存)中重读该成员变量的值,而且,当成员变量发生变化时,强迫线程将变化值写到共享内存(主存)中。

但是,对应volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的。
例如线程1 线程2在进行read load操作中,发现主内存中count的值都是5,那么都会加载这个最新的值。
在线程1对count进行修改后,会write到主内存,主内存中的count变量就变为6。
线程2由于已经进行了read load操作,在进行运算后,也会更新主内存count的值变为6。
导致线程1和线程2对count=5的两个+1操作结果错误。

volatile导致错误的原因是不能保证原子性。上述例子中,自增操作是不具备原子性的。

volatile可以保证可见性与有序性(禁止指令重排)。

synchronized关键字是防止多个线程同时执行一段代码,那么就会影响程序的执行效率。而volatile关键字在某些情况下性能要优于synchronized,但是volatile是无法替代synchronized的,因为volatile关键字无法保证操作的原子性。

要使用volatile,需要保证变量独立于任何程序状态,或者说要保证变量的原子性。

不要将volatile用在getAndOperator场合 volatile仅适合get和set场合(get和set保证原子性)。

volatile与synchronized比较

标签:opera   虚拟机   operator   一段   volatil   jvm   ati   无法   情况   

原文地址:https://www.cnblogs.com/yuanfei1110111/p/10134426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!