2015-08-15 31 views
5

在Thinking in Java中寫道Thread.interrupt()不能中斷試圖獲取同步鎖的線程,我想知道爲什麼?爲什麼Thread.interrupt()不能中斷試圖獲取鎖的線程

+3

它可以中斷線程。例如,線程在中斷時不會停止等待同步鎖定,因爲它會(如通過拋出InterruptedException)休眠。但是如果線程獲得了鎖,那麼檢查它是否中斷,它會是。 –

+0

在一個設計良好的程序中,沒有線程永遠持有鎖的時間超過檢查和更新一些變量所需的時間。應該不需要中斷來「喚醒」待處理的同步塊。如果你認爲我錯了,並且你的程序真的需要這個能力,那麼考慮使用'java.util.concurrent.locks.ReentrantLock'而不是'synchronized'。 'reentrantLock.tryLock(time,unit)'方法_can_可以被中斷。 –

回答

6

阻塞操作只有在聲明爲拋出InterruptedException時纔會中斷。顯然,​​塊沒有聲明它,因此在等待獲取鎖的時候不可能中斷一個線程。

或者,您可以使用明確的鎖定並致電Lock.lockInterruptibly()

1

這本書是錯誤的,除非它僅指​​關鍵字。 Object.wait()投擲InterruptedException

+0

我看了這本書的中文版,有幾個錯誤,但我覺得這個地方是對的。這可能是我的表達不清楚導致你的誤解 – wanghao

+0

@王浩,如果你想掌握併發性,那麼我會強烈推薦「Java併發實踐(Brian Goetz)」。 – Ruslan

+0

@wanhao'Object.wait()'拋出'InterruptedException'。沒有什麼可以誤解的。如果這本書不同意,根據定義它是錯誤的。如果它只是在討論'synchronized'關鍵字,那麼你並沒有這麼說。如果您有*理由*認爲該書是正確的,並且我誤解了某些內容,請提供。 – EJP

相關問題