Lac*_*lan 8 java api concurrency java-memory-model memory-barriers
Java 6 API问题.并呼吁LockSupport.unpark(thread)
有之前发生,从收益的关系LockSupport.park
,在刚刚出车线程?我强烈怀疑答案是肯定的,但Javadoc似乎没有明确提及它.
我刚刚发现了这个问题,因为我问自己同样的事情.根据Oracle研究员David Dice的这篇文章,答案似乎是否定的.这是本文的相关部分:
如果一个线程被阻止,
park()
我们保证后续unpark()
将使它准备就绪.一个完全合法但低质量的实现,park()
并且unpark()
将是空方法,其中程序退化为简单旋转.一个事实上这是正确的试金石park()
-unpark()
使用.
空park()
和unpark()
方法不会给你任何发生之前的关系保证,所以为了你的程序100%可移植,你不应该依赖它们.
然后,LockSupport的Javadoc说:
这些方法旨在用作创建更高级别同步实用程序的工具,并且对于大多数并发控制应用程序本身并不有用.该
park
方法仅用于以下形式的构造:
while (!canProceed()) { ... LockSupport.park(this); }
既然你必须明确地检查一些条件,这将涉及volatile
或正确同步变量,弱保证park()
实际上不应该是问题,对吧?
如果没有记录,那么你不能依赖它在关系之前创造一个发生.
特别是热点代码中的LockSupport.java只调用Unsafe.park和.unpark!
在之前发生关系通常将来自于挥发性状态标志或类似的东西写读对.
请记住,如果没有记录为创建一个发生在之前的关系,那么即使你可以证明它在你的特定系统上做了,你也必须把它当作它.未来的系统和实现可能不会.他们有充分的理由离开了自由.
归档时间: |
|
查看次数: |
505 次 |
最近记录: |