Java 6 API问题。是否LockSupport.unpark(thread)
有一个发生在之间的关系从LockSupport.park
返回在刚刚unparked线程?我强烈怀疑答案是肯定的,但Javadoc似乎没有明确提及它。Java LockSupport内存一致性
7
A
回答
1
我已经查看了JDK代码,它看起来像LockSupport方法通常在同步块之外调用。所以,你的假设似乎是正确的。
5
如果它没有记录成这样,那么你不能依靠它创建关系之前发生的事情。
特别是Hotspot代码中的LockSupport.java只需调用Unsafe.park和.unpark!
发生在之间的关系通常来自易失性状态标志或类似物上的写读取对。
请记住,如果没有记录为创建之前发生关系,那么你必须把它当作虽然它不能使用,即使你能证明它特定的系统上。未来的系统和实现可能不会。他们有充分的理由让自己离开了自由。
6
我刚刚发现这个问题,因为我问自己同样的事情。根据Oracle研究人员David Dice的this article,答案似乎是没有。下面是文章的相关部分:
如果一个线程被阻塞在
park()
我们保证后续unpark()
将使它准备。park()
和unpark()
的执行完全合法但是质量较差 将是空方法,其中 程序退化为简单旋转。 其实这就是 石蕊试验正确park()
-unpark()
的用法。
空park()
和unpark()
方法不给你任何之前发生关系的保证,所以对于你的程序是100%可移植的,你不应该依赖他们。
话又说回来,Javadoc of LockSupport说:
这些方法被设计用来作为工具,用于创建 更高级别的同步实用程序,而不是本身对于大多数并发控制应用 有用。该
park
方法 只在形式的结构设计用于:
while (!canProceed()) { ... LockSupport.park(this); }
既然你反正明确检查一些条件,这将既涉及volatile
或适当地同步变量,弱担保park()
实际上不应该是问题,对吧?
相关问题
- 1. Java线程 - 内存一致性错误
- 2. 内存一致性 - 在Java中发生之前的关系
- 3. 内存一致性||线程干扰|| Php
- 4. java.util.concurrent中的内存一致性
- 5. Java性能不一致
- 6. 逼出来的java内存..不一致的java行为
- 7. 共享内存一致性的锁定机制
- 8. Linux内存报告不一致
- 9. Java注释和方法一致性
- 10. Drupal内容重复和一致性
- 11. 数据集内的评分一致性
- 12. UIScrollView内部一致性崩溃
- 13. 为什么LockSupport Java提供但不实用
- 14. 一致性缓存| ConcurrentHashMap in,HashMap out
- 15. 热重载一致性缓存config.xml
- 16. SMP中的缓存一致性更新
- 17. Java Appengine APPSTATS导致java内存不足错误
- 18. 系统如何确保内存和缓存之间的一致性
- 19. glTexImage2D导致内存泄漏
- 20. 具有大量内存的Java性能
- 21. 的Java持久性内存泄漏
- 22. Java Arraylist的内存和性能
- 23. java持久性内存泄漏
- 24. LookupTables一致性
- 25. XPATH一致性
- 26. 一致性$ _GET
- 27. SoundPlayer导致内存泄漏?
- 28. IntPtr导致内存泄漏?
- 29. jsonObjectWithData导致内存崩溃?
- 30. Drawrect导致内存问题
很抱歉对这样一个旧的答案发表评论,但是由于问题是关于Java * API *而不是Sun/Oracle提供的*实现*,所以查看JDK如何使用'LockSupport'并不是100%正确的。 JDK开发人员可能会对其自己的实现做出假设,而便携式应用程序则不应该这样做。另外,还有一些方法可以实现* happen-before *关系,而不涉及任何'synchronized'块。 – rolve 2013-12-02 13:28:39
“......通过JDK代码查看”:您是否可以为OpenJDK发布一个hg URL? – kevinarpe 2015-12-17 08:29:58