了解发生在关系之前的事情

时间:2017-06-24 12:48:38

标签: java multithreading concurrency

考虑以下课程:

public myClass {
    int a;
    Object obj;    //This object is not of class myClass nor of a subclass of it.

    void foo(int b){
        synchronized(this){
            print(a);
            a = b;
            obj.value = b;
            obj.bar();
        }
    }

    void bar(){
        synchronized(this){
            //Some code using obj here.
        }
    }

}

Java文档声明:

  

当线程释放内部锁时,在该操作与同一锁的任何后续获取之间建立先发生关系。

假设两个线程T1,T2和myClass的一个对象叫做myclass。

现在T1调用foo,在T2调用bar之后不久,最终获得锁定并进入bar()。纠正我,如果错了,但据我所知,T2看到对T1.foo(b)变量a的变化。如何对obj进行更改?认为这是一个任意的其他对象。

是否保证了以前发生过的关系?

1 个答案:

答案 0 :(得分:2)

是:T2获取T1释放的锁定。因此,存在之前的关系,并且在释放锁之前由T1完成的写入因此在获得锁之后由T2可见。

http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility

请注意,它是关于内存操作,例如共享变量的读取和写入。不仅读取和写入被用作锁的对象的字段。