public class ThreadSafeCache {
int result;
/**
* 用synchronized修饰就有可见性,不修饰没有可见性
*/
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
public static void main(String[] args) throws InterruptedException {
ThreadSafeCache threadSafeCache = new ThreadSafeCache();
for (int i = 0; i < 8; i++) {
new Thread(() -> {
int x = 0;
while (threadSafeCache.getResult() < 100) {
x++;
//System.out.println();//加上有可见性,不加没有可见性
}
System.out.println(x);
}).start();
}
Thread.sleep(1000);
threadSafeCache.setResult(200);
}
}对于这段代码,我有两个问题:
问题一:
为什么加上System.out.println(),就有可见性,程序就可以终止?不加,就无法终止

问题二:
在不加System.out.println()的情况下,在getResult()方法加上synchronized就有可见性,程序就可以终止,这是为什么呢?按理说读取值result,和线程安不安全应该说没有关系呀,又不是修改值

我的思考:
我怀疑和synchronized有关,毕竟System.out.println()也加了synchronized关键字。我在网上找到了如下解释:

请老师解答一下我心中的疑惑