Java 6 API问题。调用LockSupport.unpark(thread)
是否有一个发生在关系之前与刚刚解除公园的线程中LockSupport.park
的返回?我强烈怀疑答案是肯定的,但Javadoc似乎没有明确提及它。
答案 0 :(得分:7)
我刚刚发现了这个问题,因为我问自己同样的事情。根据Oracle研究员this article的David Dice,答案似乎是否。这是本文的相关部分:
如果某个帖子在
park()
中被屏蔽,我们保证会有后续信息unpark()
会让它准备就绪。完全合法但质量低劣park()
和unpark()
的实现将是空方法,其中 该程序退化为简单的旋转。 事实上就是这样 石蕊测试正确park()
-unpark()
用法。
空park()
和unpark()
方法不会为您提供任何发生之前的关系保证,因此为了使您的程序100%可移植,您不应该依赖它们
这些方法旨在用作创建工具 更高级别的同步实用程序,而不是它们本身 对大多数并发控制应用程序有用。
park
方法是 设计仅用于以下形式的结构:
while (!canProceed()) { ... LockSupport.park(this); }
由于你必须明确地检查某些条件,这将涉及volatile
或正确同步的变量,park()
的弱保证实际上不应该是问题,对吗?
答案 1 :(得分:5)
如果没有记录,那么你就不能依赖它在关系之前创造一个事件。
特别是热点代码中的LockSupport.java只调用Unsafe.park和.unpark!
发生 - 之前关系通常来自易失性状态标志上的写 - 读对或类似的东西。
请记住,如果未将其记录为创建发生在之前的关系,则必须将其视为即使您不能证明它确实存在在您的特定系统上。未来的系统和实现可能不会。他们有充分的理由离开了自由。
答案 2 :(得分:0)
我查看了JDK代码,看起来LockSupport方法通常在同步块之外调用。所以,你的假设似乎是正确的。