多執行緒高併發系列之ReenTrantLock鎖

2021-10-01 19:59:13 字數 1970 閱讀 4054

reentrantlock可以替代synchronized鎖,並且比synchronized鎖更靈活

synchronized鎖是自動上鎖、自動解鎖,而reentrantlock需要手動上鎖、手動解鎖synchronized鎖在程式執行時,如果拋異常,jvm會自動釋放鎖,而reentrantlock還是得自己手動釋放鎖,所以,釋放鎖一般都是寫在finally中reentrantlock的trylock方法,是嘗試獲取鎖。就是去嘗試獲取鎖,獲取不到就繼續往下執行,不想synchronized鎖,獲取不到鎖,就在那死等,該方法有乙個boolean型別的返回值,你可以根據這個返回值,執行你的邏輯。並且可以指定嘗試獲取鎖的時間,相當於等待獲取鎖的時間。

reentrantlock的lockinterruptibly獲取鎖,除了trylock,通過lockinterruptibly方法也可以獲取鎖,可以對執行緒的interrupt方法作出響應。這個方法的意義有點類似於trylock使用超時的時候的場景。:兩個執行緒,t1獲取鎖,t2執行緒啟動,獲取不到鎖,然後你不想讓t2等了,如果用lock、trylock是沒法打斷的,如果用lockinterruptibly是可以打斷的。

reentrantlock可以是乙個公平鎖,公平鎖就是,哪個執行緒等鎖等的時間長,就先執行哪個。而synchronized鎖是非公平鎖。

public

class

reentrantlocktest

catch

(interruptedexception e)

finally})

; t1.

start()

; thread t2 =

newthread((

)->

catch

(interruptedexception e)

finally})

; t2.

start()

;try

catch

(interruptedexception e)

}}

reentrantlock還可以繫結condition,看**你就懂了,其實condition的實現就是,在aqs中有1個同步佇列,和多個條件佇列,每次newcondition的時候就相當於建立了乙個佇列,然後通過此物件呼叫方法的是,將當前執行緒加入到條件佇列中。如下面的**

public

class

conditiontest

catch

(interruptedexception e)

} list.

add(o)

; consumercondition.

signalall()

;//只喚醒了消費者執行緒

}/**

* 消費者

*/public object consumer()

catch

(interruptedexception e)

} object o = list.

removefirst()

; producercondition.

signalall()

;return o;

}public

static

void

main

(string[

] args)},

"c"+i)

.start()

;}trycatch

(interruptedexception e)

//啟動生產者執行緒

for(

int i=

0;i<

2;i++)}

,"p"

+i).

start()

;}}}

多執行緒與高併發系列(二)

2.threadpoolexecutor 3.執行緒池種類 public class mythread extends thread mythread t1 newmythread t1.start public class mythread extends otherclass implement...

多執行緒高併發

修飾靜態方法鎖的是class,非靜態鎖方法鎖的是this,只有拿到這個物件才可以繼續執行 synchronized是可重入鎖 執行緒1的方法1呼叫執行緒2的方法2,判斷是同一把鎖,在同乙個執行緒,可以呼叫。synchronized的鎖公升級 hotsport 鎖公升級過程 保證執行緒可見性 mesi...

多執行緒高併發

個人總結,帶有個人主觀,請選擇性 1,實現 runable 2,使用 thread 3,執行緒池建立 executorse newcachedthreadpool 其實哪有那麼多建立方式,本質上都是實現了runable 介面。只列出大部分使用的方法,並未代表所有執行緒方法,後續會新增實際的例子,以供...