JMM和trylock的不良使用
JMM and Undesirable use of trylock
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。
相关文章:
- 为什么"using System;"不被视为不良做法?
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 删除复制构造函数的 Intel 13.1.2 中不良C++行为的解决方法
- 如果 constexpr 和依赖假static_assert形成不良?
- 不从成员函数C 存储返回值认为不良习惯
- shared_from__this,asio的不良弱ptr例外
- 试图初始化矩阵C 时的不良同种
- 创建以不良输出结束
- 检测`boost :: Math ::工具:: brent_find_minima()的不良输入
- C HTTP POST 400不良请求
- OPENCV错误:不良的参数(字节必须为16、32或64)在简介Descriptorextractorimpl中
- 与全球矢量的不良同种
- 限制C++中允许的模板参数是否被认为是不良样式?
- 从触摸回调访问向量元素的方法时,不良访问错误
- 不良指针和乱码的数据
- CGAL:Hausdorff距离不良Alloc
- 如果您的团队同意一组别名,则使用类型别名进行STL容器不良练习
- 异常的不良TypeInfo名称
- 400 Casablanca cpprestsdk的不良要求
- JMM和trylock的不良使用