标签: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保证原子性)。
标签:opera 虚拟机 operator 一段 volatil jvm ati 无法 情况
原文地址:https://www.cnblogs.com/yuanfei1110111/p/10134426.html