3 併發程式設計 ReentrantLock 細節說明

2022-09-14 01:54:09 字數 3189 閱讀 3273

---

title: 併發程式設計-reentrantlock 細節說明

date: 2018-07-05 09:06:57

categories:

- 併發程式設計

---1. reentrantlock-是乙個可重入的互斥鎖,又被稱為「獨佔鎖」

* reentrantlock

* reentrantlock鎖在同乙個時間點只能被乙個執行緒鎖持有;而可重入的意思是,reentrantlock鎖,可以被單個執行緒多次獲取。

* reentrantlock分為「公平鎖」和「非公平鎖」。它們的區別體現在獲取鎖的機制上是否公平。「鎖」是為了保護競爭資源,防止多個執行緒同時操作執行緒而出錯,reentrantlock在同乙個時間點只能被乙個執行緒獲取(當某執行緒獲取到「鎖」時,其它執行緒就必須等待);reentraantlock是通過乙個fifo的等待佇列來管理獲取該鎖所有執行緒的。在「公平鎖」的機制下,執行緒依次排隊獲取鎖;而「非公平鎖」在鎖是可獲取狀態時,不管自己是不是在佇列的開頭都會獲取鎖。

- [x] reentrantlock 類方法簡介

// 建立乙個 reentrantlock ,預設是「非公平鎖」。

reentrantlock()

// 建立策略是fair的 reentrantlock。fair為true表示是公平鎖,fair為false表示是非公平鎖。

reentrantlock(boolean fair)

// 查詢當前執行緒保持此鎖的次數。

int getholdcount()

// 返回目前擁有此鎖的執行緒,如果此鎖不被任何執行緒擁有,則返回 null。

protected thread getowner()

// 返回乙個 collection,它包含可能正等待獲取此鎖的執行緒。

protected collectiongetqueuedthreads()

// 返回正等待獲取此鎖的執行緒估計數。

int getqueuelength()

// 返回乙個 collection,它包含可能正在等待與此鎖相關給定條件的那些執行緒。

protected collectiongetwaitingthreads(condition condition)

// 返回等待與此鎖相關的給定條件的執行緒估計數。

int getwaitqueuelength(condition condition)

// 查詢給定執行緒是否正在等待獲取此鎖。

boolean hasqueuedthread(thread thread)

// 查詢是否有些執行緒正在等待獲取此鎖。

boolean hasqueuedthreads()

// 查詢是否有些執行緒正在等待與此鎖有關的給定條件。

boolean haswaiters(condition condition)

// 如果是「公平鎖」返回true,否則返回false。

boolean isfair()

// 查詢當前執行緒是否保持此鎖。

boolean isheldbycurrentthread()

// 查詢此鎖是否由任意執行緒保持。

boolean islocked()

// 獲取鎖。

void lock()

// 如果當前執行緒未被中斷,則獲取鎖。

void lockinterruptibly()

// 返回用來與此 lock 例項一起使用的 condition 例項。

condition newcondition()

// 僅在呼叫時鎖未被另乙個執行緒保持的情況下,才獲取該鎖。

boolean trylock()

// 如果鎖在給定等待時間內沒有被另乙個執行緒保持,且當前執行緒未被中斷,則獲取該鎖。

boolean trylock(long timeout, timeunit unit)

// 試圖釋放此鎖。

void unlock()

* lock和unlock的作用

import j**a.util.concurrent.locks.lock;

import j**a.util.concurrent.locks.reentrantlock;

// locktest1.j**a

// 倉庫

class depot

public void produce(int val) finally

}public void consume(int val) finally

}}; // 生產者

class producer

// 消費產品:新建乙個執行緒向倉庫中生產產品。

public void produce(final int val)

}.start();

}}// 消費者

class customer

// 消費產品:新建乙個執行緒從倉庫中消費產品。

public void consume(final int val)

}.start();

}}public class locktest1

}

執行結果

thread-0 produce( 60) --> left= 0, inc= 60, size= 60

thread-1 produce(120) --> left= 80, inc= 40, size=100

thread-2 consume( 90) <-- left= 0, dec= 90, size= 10

thread-3 consume(150) <-- left=140, dec= 10, size= 0

thread-4 produce(110) --> left= 10, inc=100, size=100

thread-3 consume(150) <-- left= 40, dec=100, size= 0

thread-4 produce(110) --> left= 0, inc= 10, size= 10

thread-3 consume(150) <-- left= 30, dec= 10, size= 0

thread-1 produce(120) --> left= 0, inc= 80, size= 80

thread-3 consume(150) <-- left= 0, dec= 30, size= 50

3 併發程式設計

程序 程序指的就是程式執行的過程,是乙個動態的概念 程式 程式就是一系列的 檔案,是乙個靜態的概念 程序也可以說成是作業系統幹活的過程,就是作業系統控制硬體來執行應用程式的過程 程序是作業系統最核心的概念,研究進行就是在研究作業系統 一 作業系統的作用 1 隱藏醜陋複雜的硬體介面,提供良好的抽象介面...

併發程式設計3

joinablequeue 在queue的功能上多加了兩個 1 task done 告訴容器已經處理完了乙個資料 2 join 也是喲個阻塞函式,一直到佇列中的資料被處理完畢 task done的呼叫次數等於佇列中的資料數量 多執行緒理論 執行緒指的是一條流水線,是 執行的總稱,也是乙個抽象概念 執...

併發程式設計3 執行緒排程

方法說明 run 執行緒執行的主體 yield 放棄當前的時間片進入可執行狀態,可以被再次選中 start 執行緒進入可執行階段 sleep 阻塞一定的時間,會持有鎖 t2.join 等待t2執行緒執行結束,會持有鎖,有可能會死鎖 wait 鎖物件的方法,持有鎖物件的執行緒釋放鎖,進入阻塞佇列等待n...