2015-02-12 11 views
5

如果一個線程中斷另一個線程,中斷狀態是否會立即可見(即它是否存在可見性問題)?java做中斷行爲揮發嗎?

最重要的是,我想知道你有沒有使用中斷?揮發性布爾標誌似乎更可靠

+1

如果你不*檢查*你的電子郵件,你永遠不會知道一條消息已發送。如果你的前門鈴響了,你馬上就會知道s.o.正在呼叫。 – laune 2015-02-12 07:43:05

+2

'interrupt'有時可以用於中斷阻塞操作(如使用Selector或Thread.sleep等待網絡數據或等待) – immibis 2015-02-12 07:52:07

回答

7

java do interrupts act volatile?

基於閱讀javadocs我會推斷答案是肯定的。

  1. 如果中斷狀態沒有「揮發像」語義,有解決(假設的)需要一個「之前發生」沒有任何記載的方法。沒有這些,你不能確定中斷會起作用。但他們這樣做...

  2. 中斷狀態不在內存讀取和寫入方面描述。因此,沒有理由推斷內存模型適用。

而且,事實證明,中斷的行爲JLS 17.2.3指定。然後在JLS 17.4.4,中斷被具體爲定義的同步順序提到:與同步-任何點

「如果線程T1中斷線程T2,由T1中斷其中的任何其他線程(包括T2)確定T2具有被中斷(通過拋出InterruptedException或通過調用Thread.interrupted或Thread.isInterrupted)。「

底線 - 「volatile like」行爲有保證。


最重要的是我想知道你有沒有使用中斷頂部?揮發性布爾標誌似乎更可靠

當然,我這樣做。你的推斷認爲中斷不可靠是基於(IMO)關於如何實施的錯誤心理模型。此外,中斷對在sleepwait調用中被阻塞的目標線程有特殊(和有用的)行爲,依此類推。

中斷的唯一重大缺點是它們不分皁白。任何線程都可以中斷任何其他線程。相比之下,如果使用volatile布爾值,則可以更好地控制哪些線程可以「中斷」哪些線程(通過訪問修飾符,使用共享對象等)。