java - 理解发生在关系之前

标签 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 文档指出:

When a thread releases an intrinsic lock, a happens-before relationship is established between that action and any subsequent acquisition of the same lock.

假设有两个线程 T1、T2 和一个名为 myclass 的 myClass 对象。

现在T1调用foo,不久之后T2调用bar并最终获得锁并进入bar()。如果错误请纠正我,但据我了解,T2 看到了 T1.foo(b) 对变量 a 所做的更改。对 obj 进行的更改怎么样?将此视为任意其他对象。

是否保证存在先发生的关系?

最佳答案

是:T2 获取了 T1 已释放的锁。因此存在一个发生之前的关系,并且 T1 在释放锁之前完成的写入因此在 T2 获取锁后可以被 T2 看到。

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

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

关于java - 理解发生在关系之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44736560/

相关文章:

java - 在父组件上绘制图像

concurrency - 文件服务器 erlang 响应

java - 多线程文件处理和报告

java - SubethaSmtp 工作示例

java - 如何将数据从 Activity 传递到 Fragment?

c - 如何在 C 中取消引用并使用传递给 POSIX 线程的矩阵?

java - Java中具有可重入锁和条件的生产者消费者场景

c++ - 如何在不同线程中处理同一个套接字?

c++ - 多线程代码 : vector<bool> iterators incompatible

java - 测试 SimpleDateFormat 的多线程调用