代码之家  ›  专栏  ›  技术社区  ›  Kaarel Purde

java中断行为是否易变?

  •  6
  • Kaarel Purde  · 技术社区  · 9 年前

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

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

    1 回复  |  直到 9 年前
        1
  •  8
  •   Stephen C    9 年前

    java中断行为是否易变?

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

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

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

    事实证明,中断的行为 已指定 在里面 JLS 17.2.3 。然后在 JLS 17.4.4 ,中断被具体提及为定义同步顺序:

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

    一句话——保证了“类似波动”的行为。


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

    当然,我知道。你对中断不可靠的推断是基于(IMO)对中断实现方式的错误心理模型。此外,中断对于在 sleep wait 呼叫等等。

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