Java LockSupport内存一致性

Lac*_*lan 8 java api concurrency java-memory-model memory-barriers

Java 6 API问题.并呼吁LockSupport.unpark(thread)之前发生,从收益的关系LockSupport.park,在刚刚出车线程?我强烈怀疑答案是肯定的,但Javadoc似乎没有明确提及它.

rol*_*lve 7

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

如果一个线程被阻止,park()我们保证后续 unpark()将使它准备就绪.一个完全合法但低质量的实现,park()并且unpark()将是空方法,其中程序退化为简单旋转.一个事实上这是正确的试金石park()- unpark()使用.

park()unpark()方法不会给你任何发生之前的关系保证,所以为了你的程序100%可移植,你不应该依赖它们.

然后,LockSupportJavadoc说:

这些方法旨在用作创建更高级别同步实用程序的工具,并且对于大多数并发控制应用程序本身并不有用.该park方法仅用于以下形式的构造:

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

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

  • 谢谢你的回答.我现在不记得为什么我想知道这一点.我怀疑我想知道当正在运行的线程更新条件并调用`unpark`时,如果这本身保证了unparked线程会看到更新的条件处于一致状态.似乎没有保证,所以唯一安全的选择是为条件更新明确安排内存屏障. (2认同)

ele*_*tie 5

如果没有记录,那么你不能依赖它在关系之前创造一个发生.

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

之前发生关系通常将来自于挥发性状态标志或类似的东西写读对.

请记住,如果没有记录为创建一个发生在之前的关系,那么即使你可以证明它在你的特定系统上做了,你也必须把它当作它.未来的系统和实现可能不会.他们有充分的理由离开了自由.


Sla*_*hev 0

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