如果一个线程中断另一个线程,中断状态是否会立即可见(即它是否存在可见性问题)?
最重要的是,我想知道你曾经使用过中断吗?挥发性布尔标志似乎更可靠
答案 0 :(得分:7)
java做中断行为不稳定吗?
基于对javadocs的阅读,我推断答案是肯定的。
如果被中断的状态没有"易挥发如"语义,没有记录的方法来解决(假设的)需要"发生在"之前。没有它,你就不能确定中断是否有效。但他们确实......
没有根据内存读写来描述中断状态。因此,没有理由推断存储模型适用。
事实证明,JLS 17.2.3中指定了中断的行为。然后在JLS 17.4.4中,特别提到中断定义同步顺序:
"如果线程T1中断线程T2,则T1的中断与任何其他线程(包括T2)确定T2已被中断的任何点同步(通过抛出InterruptedException或通过调用线程) .interrupted或Thread.isInterrupted)。"
底线 - "易失性"行为是有保障的。
最重要的是,我想知道你曾经使用过中断吗?挥发性布尔标志似乎更可靠
当然,我知道。你断言中断是不可靠的是基于(IMO)一个不正确的心理模型,它们是如何实现的。此外,对于在sleep
或wait
调用中被阻止的目标线程,中断具有特殊(且有用)的行为,等等。
中断的唯一重要缺点是它们是不分青红皂白的。任何线程都可以中断任何其他线程。相比之下,如果你使用volatile布尔值,你可以更好地控制哪些线程可以"中断"其他的(通过访问修饰符,使用共享对象等)。