内存不可见性引发的的问题
在看java多线程编程核心技术这本的时候,按照书上一个例子敲代码,出现与书上完全不一样的结果
ThreadA
public class ThreadA extends Thread{
private MyList list;
public ThreadA(MyList list) {
super();
this.list = list;
}
public void run() {
try{
for(int i = 0;i < 1000;i ++) {
list.add(String.valueOf(new Integer(i)));
System.out.println("添加了" + (i + 1) + "个元素");
Thread.sleep(1000);
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ThreadB
public class ThreadB extends Thread{
volatile private MyList list;
public ThreadB(MyList service) {
super();
this.list = service;
}
public void run() {
try {
while(true) {
// System.out.println(Thread.currentThread().getName() + "的list.size=" + list.size());
// System.out.println(list.size());
if(list.size() >= 5) {
System.out.println("list 的大小== " + list.size() + ",线程b要退出了");
throw new InterruptedException();
}
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
说明
按照预想的结果,ThreadA往list里添加数据的时候,ThreadB发现数据size大于5时,B线程就会停止,但是事实上如果没有sout的语句,ThreadB一直不会执行到if代码里
为什么
因为JVM设置成-server模式,在这个模式下,位了线程运行的效率,ThreadB的list会一直在线程堆栈中拿list的值。ThreadA的list值也不会往公共堆栈中刷新
解决办法
将list变量设置为volatile