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!

之前发生关系通常将来自一个写 - 读一对易失性状态标记或类似的东西。

记住,如果没有记录为创建的之前发生的关系,那么您必须把它当作虽然它不能使用,即使你能证明它确实您的特定系统。未来系统和实现可能不会。他们使自己的自由有充分理由的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top