Java 6 API的问题。调用LockSupport.unpark(thread)
是否与刚解锁的线程中LockSupport.park
的返回具有 happens-before 关系?我强烈怀疑答案是肯定的,但Javadoc似乎没有明确提到。
Java 6 API的问题。调用LockSupport.unpark(thread)
是否与刚解锁的线程中LockSupport.park
的返回具有 happens-before 关系?我强烈怀疑答案是肯定的,但Javadoc似乎没有明确提到。
空的如果一个线程在
park()
中被阻塞,我们保证后续的unpark()
会使其准备就绪。一种完全合法但低质量的park()
和unpark()
实现是空方法,在这种方法中程序退化为简单的自旋。事实上,这是正确使用park()
-unpark()
的试金石。
park()
和unpark()
方法不会给你任何关系的保证,因此为了使您的程序100%可移植,您不应该依赖它们。如果没有明确记录,那么您不能依赖它来创建先后发生(happens before)关系。
具体来说,在Hotspot代码中,LockSupport.java只是简单地调用Unsafe.park和.unpark!
先后发生关系通常来自于易失性状态标志的写-读对,或类似的东西。
请记住,如果没有记录为创建先后发生关系,则必须将其视为不会创建,即使您可以证明在特定系统上可以创建。未来的系统和实现可能不会。他们之所以保留这种自由是有充分的理由的。
我已经查看了JDK代码,看起来LockSupport方法通常在同步块之外调用。因此,你的假设似乎是正确的。
LockSupport
并不完全正确。 JDK开发人员可能会对自己的实现做出假设,而可移植应用程序则不应该。此外,有一些方法可以实现happens-before关系,而不涉及任何synchronized
块。 - rolve
unpark
时,是否可以保证被唤醒的线程会以一致的状态看到更新后的条件。似乎没有保证,因此唯一安全的选择是为条件更新显式地安排内存屏障。 - Lachlanpark()
和unpark()
之间存在先行发生的关系,那么条件就不需要涉及内存屏障。所以这个问题仍然是有效的。 - rolve