Java LockSupport内存一致性

时间:2010-03-19 04:55:54

标签: java api concurrency memory-barriers java-memory-model

Java 6 API问题。调用LockSupport.unpark(thread)是否有一个发生在关系之前与刚刚解除公园的线程中LockSupport.park的返回?我强烈怀疑答案是肯定的,但Javadoc似乎没有明确提及它。

3 个答案:

答案 0 :(得分:7)

我刚刚发现了这个问题,因为我问自己同样的事情。根据Oracle研究员this articleDavid Dice,答案似乎是。这是本文的相关部分:

  

如果某个帖子在park()中被屏蔽,我们保证会有后续信息   unpark()会让它准备就绪。完全合法但质量低劣   park()unpark()的实现将是空方法,其中   该程序退化为简单的旋转。 事实上就是这样   石蕊测试正确park() - unpark()用法。

park()unpark()方法不会为您提供任何发生之前的关系保证,因此为了使您的程序100%可移植,您不应该依赖它们

然后,Javadoc of LockSupport说:

  

这些方法旨在用作创建工具   更高级别的同步实用程序,而不是它们本身   对大多数并发控制应用程序有用。 park方法是   设计仅用于以下形式的结构:

     

while (!canProceed()) { ... LockSupport.park(this); }

由于你必须明确地检查某些条件,这将涉及volatile或正确同步的变量,park()的弱保证实际上不应该是问题,对吗?

答案 1 :(得分:5)

如果没有记录,那么你就不能依赖它在关系之前创造一个事件。

特别是热点代码中的LockSupport.java只调用Unsafe.park和.unpark!

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

请记住,如果未将其记录为创建发生在之前的关系,则必须将其视为即使您不能证明它确实存在在您的特定系统上。未来的系统和实现可能不会。他们有充分的理由离开了自由。

答案 2 :(得分:0)

我查看了JDK代码,看起来LockSupport方法通常在同步块之外调用。所以,你的假设似乎是正确的。