鎖的疑問和總結

2022-09-11 22:36:24 字數 1924 閱讀 8545

獲取不到 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),這是不是意味著是同乙個鎖?

因為字串常量指向同乙個物件,所以是同乙個鎖,會互斥.new 出來的字串則不是同乙個物件,不是同乙個鎖.

reentrantreadwritelock 的總結:

(a).重入方面其內部的writelock可以獲取readlock,但是反過來readlock想要獲得writelock則永遠都不要想。

(b).writelock可以降級為readlock,順序是:先獲得writelock再獲得readlock,然後釋放writelock,這時候執行緒將保持readlock的持 有。反過來readlock想要公升級為writelock則不可能,為什麼?參看(a)

(c).readlock可以被多個執行緒持有並且在作用時排斥任何的writelock,多個被readlock 鎖定的**模組之間不會互斥,而writelock則是完全的互斥。這一特性最為重要,因為對於高 讀取頻率而相對較低寫入的資料結構,使用此類鎖同步機制則可以提高併發量。

(d).不管是readlock還是writelock都支援interrupt,語義與reentrantlock一致。

(e).writelock支援condition並且與reentrantlock語義一致,而readlock則不能使用condition,否則丟擲 unsupportedoperationexception異常。

(f).在readlock 中也是可以執行實際上的寫操作,如寫入檔案內容之類的.命名為readlock 的意思是指鎖的共享,和writelock 的獨享不同.

關於鎖的疑問:????????

1. 上鎖的方法被繼承之後也是被上鎖的嗎?需要測試兩種鎖。

筆記 關於HBase的總結和疑問

hbase中的行是按照rowkey的字典順序排序的,然而這種設計卻是熱點產生的源頭。client大量直接的訪問集群中的乙個或少數幾個節點 讀或者寫等其它操作 大量訪問會使熱點region所在的單個機器超出自身承受能力,引起效能下降甚region不可用。1 hfile檔案中是按照key value儲存...

記錄 前端實踐總結和疑問1

記錄一下悲催的一天,有好多事要幹偏偏選擇了寫前端。新手上路太痛苦了 做了太久不想再繼續浪費時間,有些問題就擱置了,以後慢慢乙個乙個乾掉!不同的元件塊用分隔還是很實用,不然真的不知道怎麼擺了,元素跳來跳去的。至今還不知道有什麼方法可以直接讓元素居中。我現在採用的是這樣的 頁面呈現的內容用兩個包裹,第乙...

大資料疑問總結

1.storm與flink怎樣寫出符合併發的程式?靜態與動態,不變快取的盡量載入一次 2.封裝與模組化思想?類與方法?示例,一次編寫,到處執行 過濾港口和錨地 3.物件序列化?storm與flink中的區別,各個 元件之間的序列化問題 各個運算元是否需要序列化,怎樣避免序列化 4.記憶體中怎樣減少f...