jdk併發工具包之鎖

2021-08-07 22:58:53 字數 2685 閱讀 2112

1、cynchronized擴充套件:可重如鎖reentrantlock

reentrantlock是通過cas演算法實現的

renntrantlock lock=new reentrantlock();

lock.lock();//如果資源被占用則會等待

//**鎖定區域

finally{

//必須手動解鎖

lock.unlock();

(1)中斷鎖

reentrantlock 提供了可中斷鎖lockinterruptibly

lock.lockinterruptibly();//會獲得鎖,但是會優先相應中斷

lock.unlock();

當當前執行緒終端會釋放鎖

(2)顯示等待鎖trylock();

trylock()會申請鎖,如果無法獲得鎖,將返回false

trylock也可以設定嘗試一段時間獲取鎖

(3)公平鎖 fair

在建立reentrantlock的時候,有乙個構造方法reentrantlock(boolean fair);預設為false,如果傳入true則表示使用公平鎖

2、condition

condition是搭配reentrantlock搭配使用的,用於控制當前reentrantlock鎖是否釋放,是否被喚起。

reentrantlock lock=new reentrantlock();

condition condition=lock.newcondition();

lock.lock();

condition.await()//會立即釋放lock,進入等待狀態,直到signal或者signalall喚醒;

用法與await基本相同,但是不會在等待過程中響應中斷

//鎖定**

finally

lock.unlock

3、訊號量semaphone,允許多個執行緒同時訪問

reentrantlock和synchronized鎖定之後,至允許乙個執行緒訪問,而semaphone是允許多個執行緒同時訪問;

semaphone(int permits)//permits為許可數量,允許同時有permits訪問

semaphone(int permits,boolean fair)//fair表示是否公平

semaphone中的主要方法有

acquire();嘗試獲得乙個許可,如果無法獲得,則會等待;

release();當執行緒執行完成之後釋放乙個許可

tryacquire();嘗試獲得乙個許可,如果獲取到返回true;否則返回false;

tryacqurie(timeout,unit);在制定時間內嘗試獲得乙個許可;

acquireuninterrupt();用法與acquire一致,但是不會相應中斷;

4、readwritelock讀寫鎖

readwritelock適用於大量讀,少量寫的操作

讀與讀之間不阻塞,讀與寫阻塞,寫與寫阻塞

readwritelock就是同時只允許有乙個執行緒寫,但是多個執行緒可以同時讀,不能一邊讀一邊寫。

readwritelock rwl=new readwritelock();

lock readlock=wrl.readlock();

readlock.lock();

//**

readlock.unlock();

lock writelock=wrl.readlock();

writelock.lock();

//**

writelock.unlock();

5、countdownlock 倒計時器

主要用於控制等待執行緒,通過countdownlock(int count);指定計數器個數,表示有count個執行緒執行完成之後,才能執行當前(main中的)主線程;

通過await()檢查,呼叫await之後當前執行緒會等待,知道執行完指定個數的執行緒;

6、迴圈柵欄cyclicbarrier

cyclicbarrier(int parties,runable barrieraction) parties為執行緒數,barrieraction為執行緒執行完成之後的通知執行緒

cyclicbarrier會集合夠parties個執行緒之後,讓他們同時執行,執行完成之後通過barrieraction通知。

cyclicbarrier主要作用是保證parties個執行緒執行同步,第一次呼叫await方法會集合執行緒,第二次呼叫會await集體執行成功通知barrieraction

cyclicbarrier柵欄中的某乙個執行緒被中斷,會影響其他執行緒的執行,會丟擲brokenbarrierexception。

問題:當cyclicbarrier中某乙個執行緒執行過程中被中斷,其他執行緒會執行成功嗎?

7、locksupport執行緒阻塞工具類

locksupport可以讓乙個執行緒在任何乙個地方中斷,功能類似與thread的supend和resume,thread中如果resume在supend之前,會導致執行緒永久掛起,

使用locksupport的pack和unpack則不會發生這種情況。locksupport是使用訊號量機制,為每個執行緒建立了乙個許可,及時unpack執行在pack之後,unpack會建立乙個許可,pack執行會消耗這個許可,會立即返回。locksupport被中斷之後是不會跑出interruptedexception,但是會同步執行緒狀態,thread.isinterrupted()

java 併發工具包 BlockingQueue

blockingqueue 是乙個介面,字義上理解表示為乙個阻塞佇列 1 生產者入隊 2 消費者出隊 blockingqueue 具有 4 組不同的方法用於插入 移除以及對佇列中的元素進行檢查。如果請求的操作不能得到立即執行的話,每個方法的表現也不同。這些方法如下 拋異常 特定值 阻塞 超時 四組不...

併發工具包 阻塞佇列BlockingQueue

阻塞佇列,顧名思義 如果佇列滿了,那麼會進入阻塞狀態,當有消費者從佇列中取出資料後,再解除阻塞狀態。如果隊列為空,從佇列中取資料就會進入阻塞狀態。直至佇列中有資料為止。blockingqueue是介面,目前已知的實現類如下 arrayblockingqueue 底層底層通過陣列來儲存佇列中的元素,所...

Python之爬蟲工具包

requests包 是乙個實用的python的http客戶端庫,編寫爬蟲從web上爬取資料時經常用到 簡單實用,介面簡單 requests.get url lxml包 主要用來解析通過requests抓取的html內容,從中提取出我們需要的資料,在對html文字內容進行提取 篩選時用到的是xpath...