【问题标题】:How Java java.util.concurrent.locks.Lock guarantees memory sync between threads?Java java.util.concurrent.locks.Lock 如何保证线程之间的内存同步?
【发布时间】:2015-03-24 20:19:19
【问题描述】:

看看这个java代码sn-p:

 Lock l = ReentrantLock();
 l.lock();
 try {
     counter++;
 } finally {
     l.unlock();
 }

这段代码保证在特定时间只有一个线程会执行try块中的代码。

我的问题是:锁定/解锁机制如何保证线程之间的内存可见性?(确保计数器结果将被线程 X 刷新到主内存的机制是什么? , 并且会被之后的线程 Y 从主内存中加载?)

【问题讨论】:

    标签: java multithreading concurrency jvm synchronization


    【解决方案1】:

    http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5

    17.4.5。下单前发生

    两个动作可以通过happens-before关系排序。如果一个动作发生在另一个动作之前,那么第一个动作对第二个动作可见并在第二个动作之前排序。

    ...

    从上面的定义可以得出:

    监视器上的解锁发生在该监视器上的每个后续锁定之前 监视器。

    ...

    在happens-before一致的操作集中,每次读取都会看到一次写入,而happens-before排序允许它看到。

    看见暗示是从不同的线程看见。

    【讨论】:

    • 感谢参考,它解释了unlock和next lock之间存在happens-before关系(这是合理的),但它仍然没有解释为什么原始锁到unlock之间的数据是要同步到下一个线程的那个..
    • 线程 B 的值可能与线程 A 不同的原因是指令重新排序等。本页解释了为什么 Happens-Before 关系确保内存一致性:docs.oracle.com/javase/tutorial/essential/concurrency/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    相关资源
    最近更新 更多