java的do中断行为不稳定



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

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

java中断的行为是不稳定的吗?

根据对javadocs的阅读,我推断答案是肯定的。

  1. 如果中断状态没有"类似volatile"的语义,那么就没有文档化的方法来解决(假设的)对"发生之前"的需求。如果没有这些,你就无法确定中断是否有效。但他们确实。。。

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

事实证明,中断的行为是在JLS 17.2.3中指定的。然后在JLS 17.4.4中,中断被特别提到定义了一个同步顺序:

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

最重要的是,"类波动"行为是有保证的。


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

当然,我知道。你认为中断是不可靠的,是基于(IMO)对中断实现方式的错误心理模型。此外,对于在sleepwait调用中被阻塞的目标线程,中断具有特殊的(有用的)行为,依此类推

中断的唯一显著缺点是它们是不加区别的。任何线程都可以中断任何其他线程。相比之下,如果您使用的是volatile布尔值,那么您可以更好地控制哪些线程可以"中断"其他线程(通过访问修饰符、共享对象的使用等)。

最新更新