【问题标题】:JMM and Undesirable use of trylockJMM 和不受欢迎的 trylock 使用
【发布时间】:2015-01-06 00:28:50
【问题描述】:

trylock 的不当使用

T1                                   T2
x = 42;                              while (lock.trylock())
lock.lock();                               lock.unlock();
                                     assert(x == 42);

在 java 和 c++ 内存模型中,都允许 x=42 在 lock(1) 之后移动。 因此断言可能在 T2 线程中失败。因此在 C++ 内存模型中 他们定义 trylock 失败的行为可能是虚假。 但我没有找到 java 内存模型中 trylock 的规格是什么。 可以在线程 2 中断言保证在 Java 中传递。参考会有所帮助!

参考: http://rsim.cs.illinois.edu/Pubs/08PLDI.pdf

【问题讨论】:

    标签: java c++ concurrency memory-model java-memory-model


    【解决方案1】:

    来自Lock的javadoc:

    锁定和解锁操作不成功,可重入 锁定/解锁操作,不需要任何内存 同步效果。

    【讨论】:

      【解决方案2】:

      如果 trylock 成功获取锁,它将与 T1 之前的锁同步。通过锁定语义,我们知道当我们进入循环时,T1 不可能有先前的锁定。因此,如果我们进入循环,则与 T1 没有同步关系。

      如果(或何时)trylock 失败,则与 T1 没有同步关系。至少,如果我们假设trylock 失败是answer by jtahlborn 建议的“不成功的锁定操作”。

      因此,在任何情况下,赋值和断言之间都没有发生之前的关系。因此,我们有一个数据竞争,x 的值可能是也可能不是 42。

      我找不到任何显式 Java trylock 可能是“虚假”的东西。但是,此示例在 Java 中存在虚假行为。

      尽管如此,JavaDoc for trylock

      如果可用则获取锁并立即返回 值为真。

      但在我看来,语言规范胜过 JavaDoc。

      【讨论】:

        猜你喜欢
        • 2021-02-20
        • 2017-05-30
        • 1970-01-01
        • 2016-03-10
        • 2021-04-04
        • 1970-01-01
        • 2011-07-05
        • 1970-01-01
        • 2020-10-16
        相关资源
        最近更新 更多