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