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 介面。只列出大部分使用的方法,並未代表所有執行緒方法,後續會新增實際的例子,以供...