Java Lock支持内存一致性
-
21-09-2019 - |
题
Java 6 API 问题。是否打电话 LockSupport.unpark(thread)
有一个 发生在之前 与返回的关系 LockSupport.park
在刚刚未停放的线程中?我强烈怀疑答案是肯定的,但 Javadoc 似乎没有明确提及。
解决方案
我已经看过虽然JDK代码,它看起来像LockSupport方法通常被称为同步块的外部。所以,你的假设似乎是正确的。
其他提示
我刚刚发现这个问题是因为我也在问自己同样的事情。根据 本文 甲骨文研究员 大卫·戴斯, ,答案似乎是 不. 。这是文章的相关部分:
如果一个线程被阻塞
park()
我们保证后续unpark()
会让它准备好。完全合法但低质量的实施park()
和unpark()
将是空的方法,其中程序将其退化为简单旋转。 实际上,这是正确的试石测试park()
-unpark()
用法。
空的 park()
和 unpark()
方法不会给你任何 发生在之前 关系保证,因此为了让你的程序 100% 可移植,你不应该依赖它们。
话又说回来, LockSupport 的 Javadoc 说:
这些方法被设计为用作创建高级同步实用程序的工具,并且对大多数并发控制应用程序本身并不有用。这
park
方法设计仅用于形式的结构:
while (!canProceed()) { ... LockSupport.park(this); }
因为无论如何你都必须明确检查某些条件,这将涉及 volatile
或正确同步的变量,弱保证 park()
实际上应该不是问题,对吧?
如果它未记录这样,那么你不能依靠它创造的关系之前发生的。
具体LockSupport.java在热点代码简单地调用Unsafe.park和.unpark!
在之前发生关系通常将来自一个写 - 读一对易失性状态标记或类似的东西。
记住,如果没有记录为创建的之前发生的关系,那么您必须把它当作虽然它不能使用,即使你能证明它确实您的特定系统。未来系统和实现可能不会。他们使自己的自由有充分理由的。