0.volatile 和 synchronized对比
0.用synchronized还是Lock呢?
1.JMM与内存可见性问题
问题1:
- 这个程序,主线程Main永远不会输出东西,因为线程testVolitile在自己的工作内存(即高速缓存)中把标志位flag更新为true,并写回主内存后,主线程main的工作内存中存的flag仍然是new TestVolatile()时的默认值false,并没有从主内存中获取最新的flag值true。
public class Main {
public static void main(String[] args) {
TestVolatile tv = new TestVolatile();
启动线程 不能用tv.run(); 因为他只是执行了run方法而已
tv.start();
while (true) {
if (tv.getFlag()) {
System.out.println("Main线程输出了tv线程的flag:" + tv.getFlag());
}
}
}
}
class TestVolatile extends Thread{
private boolean flag = false;