我们常见的并发编程的可见性通常举的都是下面这个例子,因为缓存的存在所以第一个线程无法“看见”第二个线程修改的flag值,每次都从自己的缓存中查看,所以陷入死循环。
private static boolean flag=false;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
while (!flag){
}
}).start();
Thread.sleep(200);
new Thread(()->{
flag=true;
}).start();
}
但是今天回顾并发编程的时候发现如果在代码中加入控制台打印,如下
private static boolean flag=false;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
while (!flag){
System.out.println(1); // 加入了控制台打印
}
}).start();
Thread.sleep(200);
new Thread(()->{
flag=true;
}).start();
}
这时候不会陷入死循环。一开始我还不知道是什么问题,多启动了几次发现还是运行一会儿就终止了。我就点进了println方法,发现他加了一个锁,
public void println(int x) {
synchronized (this) {
print(x);
newLine();
}
}
我就感觉是锁的问题,于是我就再次尝试
private static boolean flag=false;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
while (!flag){
test();
}
}).start();
Thread.sleep(200);
new Thread(()->{
flag=true;
}).start();
}
private synchronized static void test(){
}
程序还是会终止,锁定问题就是synchronized的问题。
最后一次尝试将test方法的synchronized去掉,发现程序又进入了一个死循环。确定就是synchronized的问题。
好吧,不会了 ,先埋个坑,现在知识储备解决不了哈