java做中断行为不稳定?

Kaa*_*rde 5 java concurrency multithreading interrupt volatile

如果一个线程中断另一个线程,中断状态是否会立即可见(即它是否有可见性问题)?

最重要的是,我想知道你有没有使用过中断?挥发性布尔标志似乎更可靠

Ste*_*n C 7

java做中断行为不稳定?

基于对javadocs的阅读,我推断答案是肯定的.

  1. 如果被中断的状态没有"易失性"语义,则没有记录的方法来解决"先前发生"的(假设的)需求.没有它,你无法确定中断是否有效.但是他们......

  2. 没有根据存储器读写来描述中断状态.因此,没有理由推断存储器模型适用.

而且,事实证明,中断的行为在JLS 17.2.3中规定.然后在JLS 17.4.4中,特别提到中断定义同步顺序:

"如果线程T1中断线程T2,则T1的中断与任何其他线程(包括T2)确定T2已被中断的任何点同步(通过抛出InterruptedException或通过调用Thread.interrupted或Thread.isInterrupted)."

底线 - 保证"挥发性"行为.


最重要的是,我想知道你有没有使用过中断?挥发性布尔标志似乎更可靠

当然,我知道.你断言中断是不可靠的是基于(IMO)一个不正确的心理模型,它们是如何实现的.此外,中断对于被阻塞sleepwait调用的目标线程具有特殊(和有用)行为,等等.

中断的唯一重要缺点是它们是不分青红皂白的.任何线程都可以中断任何其他线程.相比之下,如果您使用volatile布尔值,您可以更好地控制哪些线程可以"中断"其他线程(通过访问修饰符,使用共享对象等).