獲取不到 synchronized 的阻塞線程什么時候會釋放?<核心>p634 14.3.3 節
當線程嘗試獲得鎖的時候,如果鎖被其他線程占用,那么這個線程就會進入阻塞狀態(不管是內部鎖,還是ReentrantLock).只有在其他線程釋放鎖的時候,而且線程調度器允許這個線程持有這個鎖的時候,這個線程才會變成非阻塞狀態.
同時當線程處于這種因獲取鎖而進入的阻塞狀態,就是遇到了lock()方法而阻塞,是不可以被中斷的.內部鎖(synchronized)的也是lock() 方法.
而另外一種獲取鎖的方法,tryLock 則是可以被中斷的.
所以synchronized 正在獲取鎖的線程不能被中斷,而ReentrantLock 的可以(通過使用tryLock方法.)
獲取到synchronized 的線程可sleep 否?能手動解鎖否?能被中斷嗎?
synchronized 鎖會自動獲取一個內部鎖,和ReentrantLock 的鎖一樣.而synchronized 的鎖定的代碼之間也是可以試用sleep 方法的,所以是可以sleep.
synchronized 不能手動解鎖,沒有lock.unlock 這個方法.
synchronized 和一般的鎖一樣,所以是可以被中斷的.就是鎖在鎖內部你可以檢測中斷狀態來決定如何處理中斷.
線程阻塞或則等待的總結:<核心>p648
1.線程會因為嘗試去獲得鎖而阻塞.不可中斷,由cpu決定是否非阻塞
2.因為條件對象的wait()/await() 方法而等待.這種等待狀態需要先用條件解除等待,如signalAll 或notifyAll,解除后還是處于等待獲取鎖的阻塞狀態,再等待其他線程釋放鎖,這些線程才可能變成非阻塞(轉換為情況1了)
3.因為sleep,join() 方法而等待.可被中斷.
線程中斷信號的處理:
1.因情況2 和情況3進入等待或阻塞狀態時,遇到中斷會拋出中斷異常.
2.因情況1進入阻塞時,遇到中斷信號,會因阻塞而不能處理,要等到線程轉為非阻塞時才會去處理.
3.線程正常允許時,遇到中斷信號,則看代碼有沒有偵測到信號,還有怎樣處理.參考:<核心>p631
不同對象中的synchronized("lock") 會不會互斥? synchronized 中的關鍵字是字符串,字符串相同則是同一個常量(沒有new),這是不是意味著是同一個鎖?
但是不同變量的內部鎖synchronized("lock")會是同一個嗎?
上鎖的方法被繼承之后也是被上鎖的嗎?需要測試兩種鎖。
ReentrantReadWriteLock 中的ReadLock鎖定是指鎖定的代碼中只能 執行讀操作而不能執行寫操作?
ReentrantReadWriteLock 的總結:
(a).重入方面其內部的WriteLock可以獲取ReadLock,但是反過來ReadLock想要獲得WriteLock則永遠都不要想。(b).WriteLock可以降級為ReadLock,順序是:先獲得WriteLock再獲得ReadLock,然后釋放WriteLock,這時候線程將保持Readlock的持 有。反過來ReadLock想要升級為WriteLock則不可能,為什么?參看(a)(c).ReadLock可以被多個線程持有并且在作用時排斥任何的WriteLock,而WriteLock則是完全的互斥。這一特性最為重要,因為對于高 讀取頻率而相對較低寫入的數據結構,使用此類鎖同步機制則可以提高并發量。(d).不管是ReadLock還是WriteLock都支持Interrupt,語義與ReentrantLock一致。(e).WriteLock支持Condition并且與ReentrantLock語義一致,而ReadLock則不能使用Condition,否則拋出 UnsupportedOperationException異常。
 
  | 
新聞熱點
疑難解答