并发--Effective Java的一小段代码
if(!stopRequested) { while(true){ i++; } },这种情况,backgroundThread线程永远不会结束。
为了避免以上两种情况,可以用volatile修饰stopRequested,这样每个线程在修改stopRequested后都会把修改结果同步到主内存,每个线程在读取stopRequested时都会从主内存中获取;volatile同时也阻止了jvm对第二种情况的优化
建议细看: 《java并发编程实践》
注:
在不加 volatile修饰, 把i++改成System.out.println("t"); 的情况下, 使用-server, -client参数都会在1秒后退出.
在windows下,jvm默认是client模式, 在linux下默认是 server模式.
参考:
Java线程安全兼谈DCL
用happen-before规则重新审视DCL