Java Volatile关键字可见性问题分析
Java 内容模型
具体可以查看这篇文章Java内存模型,大致就是,在Java多线程工作中,每个线程有自己的工作内存,变量存在主内存,在Java线程读取变量的时候,会优先在自己的工作内存中查找,当工作内存中不存在时,会通过Load操作进行读取变量,当对数据发生修改时会通过Save将变量更新到主内存中,而为了保证内存的可见性,可以通过Volatile关键字修饰变量,通过关键字修饰后的变量,在被一个线程更改后,新的值会对其他的线程立即得知。听起来是那么回事,但是自己理解的时候,用多线程发现有时候好像又不是那回事,好像普通变量也会在一个线程更新值的时候,对别的线程也会进行更新,这个问题目前没有解决还需要,继续了解Save和Load的时机。
普通变量(非Vola变量)的内存不可见性
package LockFuncs;
public class VolatileTest {
boolean isStop = false;
public void test(int i){
Thread t1 = new Thread(){
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
isStop=true;
System.out.println(isStop);
}
};
Thread t2 = new Thread(){
public void run() {
while (!isStop) {
}
}
};
t2.start();
t1.start();