java做中断行为不稳定?

时间:2015-02-12 07:37:27

标签: java multithreading concurrency interrupt volatile

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

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

1 个答案:

答案 0 :(得分:7)

  

java做中断行为不稳定吗?

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

  1. 如果被中断的状态没有"易挥发如"语义,没有记录的方法来解决(假设的)需要"发生在"之前。没有它,你就不能确定中断是否有效。但他们确实......

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

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

      

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

    底线 - "易失性"行为是有保障的。


      

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

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

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