【问题标题】:java do interruptions act volatile?java中断行为不稳定吗?
【发布时间】:2015-04-12 20:32:57
【问题描述】:

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

除此之外,我想知道您是否使用过打断?一个易失的布尔标志似乎更可靠

【问题讨论】:

  • 如果您不检查您的电子邮件,您将永远不会知道邮件已发送。如果你的前门铃响了,你马上就知道了。正在打电话。
  • interrupt 有时对中断阻塞操作很有用(例如使用 Selector 或 Thread.sleep 或等待等待网络数据)

标签: java multithreading concurrency interrupt volatile


【解决方案1】:

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 布尔值,您可以更好地控制哪些线程可以“中断”哪些其他线程(通过访问修饰符、使用共享对象等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 2011-04-24
    • 2012-05-07
    • 2012-12-12
    • 1970-01-01
    • 2011-01-27
    • 2019-08-02
    • 1970-01-01
    相关资源
    最近更新 更多