不适当地使用幽会
T1 T2
x = 42; while (lock.trylock())
lock.lock(); lock.unlock();
assert(x == 42);在java和c++中,内存模型都允许x=42在锁(1)之后移动。因此断言可能在T2线程中失败。因此,在C++记忆模型中,他们定义了尝试锁定的行为可能是假。但是,我没有找到java内存模型中用于尝试锁的规范。可以在线程2中断言,保证在中传递。推荐信会有帮助的!
参考文献: http://rsim.cs.illinois.edu/Pubs/08PLDI.pdf
发布于 2015-01-06 00:33:47
从javadoc到锁定
不成功的锁定和解锁操作以及重入锁定/解锁操作不需要任何内存同步效果。
发布于 2016-03-11 10:13:48
如果尝试锁成功地取得了锁,它将同步-与以前的锁由T1。通过锁语义,我们知道当我们进入循环时,T1不可能有先前的锁。因此,如果我们进入循环,就没有与T1相关的同步。
如果尝试锁失败(或何时),则不存在与T1相关的同步。至少,如果我们假设trylock失败是jtahlborn的答复建议的“不成功的锁定操作”。
因此,在任何情况下,在转让和断言之间的关系之前都不会发生。因此,我们有一个数据竞赛,x的值可能是42,也可能不是42。
我无法清楚地发现Java trylock可能是“虚假的”。但是,这个示例在Java中具有虚假的行为。
尽管如此,JavaDoc用于幽会说
如果锁可用,则获取该锁,并立即返回值true。
但在我看来,语言规范胜过JavaDoc。
https://stackoverflow.com/questions/27790268
复制相似问题