JUC框架學習 lock鎖總結

2021-10-06 07:46:13 字數 2218 閱讀 5384

locke 介面: 支援予以不同(重入,公平等)的鎖規則: 1. 公平鎖 2.非公平鎖 3.可重入鎖

實現lock介面的鎖,其構造方法中有 boolean fair引數控制,當fair為

true時,是公平鎖,反之為非公平鎖。預設是非公平鎖。以reentrantlock為例原始碼如下:

無參構造:

/*** creates an instance of .

* this is equivalent to using .

*/public reentrantlock()

有參構造:

/*** creates an instance of with the

* given fairness policy.

** @param fair if this lock should use a fair ordering policy

*/public reentrantlock(boolean fair)

對於鎖裡面一定會有乙個fifo的同步佇列進行鎖定控制。(非公平鎖和公平鎖),其

原始碼如下:公平;fairsync(), nonfairsync()

public reentrantreadwritelock(boolean fair)

讀寫鎖 : 和lock類似的方式定義了一些讀者可以共享而寫入者獨佔的鎖。

同步對列提供了兩類鎖機制: 1. 獨佔鎖 2. 共享鎖。 readwritelock中的readlock()和writelock()分別是共享鎖和獨佔鎖。

無障礙鎖:stampedlock(加強版的讀寫鎖),讀鎖和寫鎖是完全互斥的。也就是說在進行資料輸入的時候,讀取操作需要進行等待,

等待寫鎖釋放之後才可以繼續進行讀鎖相應的處理。

stampedlock提供了兩類鎖:1.悲觀鎖 :會假設互斥鎖的裝填一直都會存在,預設的處理形式都是悲觀鎖。

2.樂觀鎖 :假設在讀取的時候沒有這麼多的寫入操作,如果真的發生了寫入,那麼就需要進行乙個狀態

判斷,通過狀態的結果來巨鼎是否需要進行鎖的處理。

主要方法:1. 獲取讀悲觀鎖,同時獲取乙個標記 :public long readlock();

2. 獲取讀悲觀鎖,同時獲取乙個標記 :public long writelock();

3. 獲取讀的樂觀鎖: public 龍tryoptimisticread();

4. 進行指定標記的驗證 :public boolean validate (long stamp);

5. 釋放鎖 :public void unlick(long stamp);

6. 釋放讀鎖 :public void unlickread(long stamp);

7. 釋放寫鎖 :public void unlickwrite(long stamp);

互斥鎖:reentrantlock :普通可重用的互斥鎖進行操作。lock 於reentranlock 實現的只是乙個最為基礎的鎖的處理機制,利用lock ()

與unlock()方法就可以構建出乙個類似同步**塊的機構。但是其結構要比通過**塊更加簡單。

擴充套件: 可重入鎖

1.synchronized可重入,因為加鎖和解鎖自動進行,不必擔心最後是否釋放鎖;reentrantlock也可重入,但加鎖和解鎖需要手動進行,

且次數需一樣,否則其他執行緒無法獲得鎖。

2.synchronized是獨佔鎖,加鎖和解鎖的過程自動進行,易於操作,但不夠靈活。reentrantlock也是獨佔鎖,加鎖和解鎖的過程需要手動進行,

不易操作,但非常靈活。

3.synchronized不可響應中斷,乙個執行緒獲取不到鎖就一直等著;reentrantlock可以相應中斷。

reentrantlock好像比synchronized關鍵字沒好太多,我們再去看看synchronized所沒有的,乙個最主要的就是reentrantlock還可以實現

公平鎖機制。

!!reentrantlock的可重入體現

final boolean nonfairtryacquire(int acquires)

}else if (current == getexclusiveownerthread())

return false;

}總結:reentrantlock可重入主要體現在current == getexclusiveownerthread()這個判斷方法上面。如果是當前重入執行緒,資源狀態新增

請求數,注意釋放的時候也是要釋放這個多次的。

JUC 3 0 鎖 Lock的基本使用

在併發開發中,鎖也是經常使用的乙個工具,主要是用於對共享資源的控制,常用的鎖就是lock和synchronized,這兩個鎖都可以達到執行緒安全的目的,但是在使用上有較大差別.lock一般情況用於synchronized不滿足要求或者不合適的時候,lock是乙個介面,最常用的實現類就是reentra...

JUC學習之執行緒8鎖

介紹執行緒8鎖圍繞乙個題目展開,題目 列印的是 one 還是 two 1.兩個普通同步方法,兩個執行緒,列印?public class testthread8monitor start new thread new runnable start class number public synchro...

juc學習備忘錄 執行緒八鎖

package com.wyz.juc 執行緒八鎖 題目 判斷列印的 one or two 1.兩個普通同步方法,兩個執行緒,標準列印,列印?one two 2.新增tread.sleep 給getone 列印?one two 3.新增普通的getthree 列印?three one two 4.兩...