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中传递。参考会有所帮助!
答案 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。