Java并发编程

Java内存可见性

2020-10-05  本文已影响0人  Chermack

经常访问的变量会从主存读取到线程的高速缓冲区,导致不同线程间对数据的修改不能及时同步:


import java.util.concurrent.TimeUnit;

class TObject{
    public boolean b = false;
}

public class VisibilityTest {
    static boolean flag = true;
    static int num = 1;
    static String s = "a";
    static TObject tObject = new TObject();
    static Object object;
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            while (flag) {
                if (num==100) break;
                if (s.equals("b")) break;
                if (tObject.b) break;
                if (object!=null) break;
//                System.out.println("this can stop!");
            }
        });
        t1.start();
        TimeUnit.MILLISECONDS.sleep(10);
        flag = false;
        num = 100;
        s = "b";
        tObject.b = true;
        object=new Object();
    }
}

上方代码直接运行,t1线程始终无法读到main线程对值的修改正常结束。

要想同步t1和main的值。

注:
volatile和synchronized都可以实现线程间的可见性,但volatile没有上锁步骤,在实现可见性方面更轻量,但不能保证原子性。

上一篇 下一篇

猜你喜欢

热点阅读