JMM和不受欢迎的trylock使用

时间:2015-01-06 00:28:50

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

不希望使用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

2 个答案:

答案 0 :(得分:4)

来自Lock的javadoc:

  

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

答案 1 :(得分:0)

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

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

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

我找不到任何显式,而Java trylock可能是"虚假"。但是,此示例在Java中具有虚假行为。

尽管如此,JavaDoc for trylock

  

获取锁定(如果可用)并立即返回   价值是真的。

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