volatile的理解
Volatile在Java编程中经常用到,尤其是在多线程的编程中,在多处理器开发中保证共享变量的“可见性”,Volatile关键之不能保证变量的原子性。
可见性的意识是,一个线程修改这个变量,另一个变了能获取到这个变量修改后的最新值。
volatile使用与状态标记,下面就是一个例子。
举个栗子
Volatile的共享变量在进行写操作时会有个LOCK操作,会使当前处理器缓存行的数据写入内存,并导致其他处理器中的该内存地址无效,处理器强制刷新缓存,这样就保证了数据的可见性。
只能在一些情形下使用 volatile 变量替代锁,实现线程安全,必须同时满足下面两个条件:对变量的写操作不依赖于当前值。 该变量没有包含在具有其他变量的不变式中。
对于“对变量的写操作不依赖于当前值”的理解就是不能保证类似这样的操作的线程安全性。
volatile a = 0;
a = a + 1;
对于“该变量没有包含在具有其他变量的不变式中”的理解,可以被写入 volatile 变量的这些有效值独立于任何程序的状态。
先说下什么是不变式,比如年龄必须大于等于零,高大于低,余额必须大于多少零等。
下面的例子就不能保证doSomething方法的线程安全,因为不变式中包含了其他的变量。
不能实现线程安全
领取专属 10元无门槛券
私享最新 技术干货