如题在学习可见性时写了如下代码:
public static boolean flag = false;
@Test
public void start() throws InterruptedException {
Thread read = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (flag) {
System.out.println("yes");
} else {
System.out.println("no");
}
}
});
read.start();
Thread write = new Thread(new Runnable() {
@Override
public void run() {
flag = true;
}
});
write.start();
Thread.sleep(2000);
}
控制台输出:yes
请问这是因为Thread.sleep会刷新工作内存吗?
你这样的写法我们可以看到,在read线程内部先暂停了1s,然后在获取flag进行比较,但是这样的话会出现一个问题,write线程已经完全操作完了并且把flag修改了,此时你再获取flag那就已经是最新的了,所以会是true!所谓的线程之间不可见是因为线程内部保有了自己的副本,但是read线程在获取flag并且创建自己的副本的时候已经是最新的了,所以建议这样修改