JMM和trylock的不良使用

JMM and Undesirable use of trylock

本文关键字:不良 trylock JMM      更新时间:2023-10-16

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

来自 javadoc for Lock:

锁定和解锁操作失败,以及可重入 锁定/解锁操作,不需要任何内存 同步效果。

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

如果(或当)trylock 失败时,则与 T1 没有同步关系。至少,如果我们假设trylock失败是"不成功的锁定操作",正如jtahlborn的答案所暗示的那样。

因此,在任何情况下

,赋值和断言之间都不存在先行关系。因此,我们有一个数据竞赛,x 的值可能是也可能不是 42。

我找不到任何明确的东西表明Java trylock可能是"虚假的"。但是,此示例在 Java 中具有虚假行为。

尽管如此,用于trylock的JavaDoc说

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

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