以前的博客雖然是本身寫的,可是也得常常回顧啊。html
剛纔用到線程鎖,可是又不敢肯定用什麼最好了。以前學習過,但使用很少,不夠深入,也沒有很理解,有點遺忘了。java
ReentrantLock 和Synchronized都是可重入鎖,即本線程擁有鎖之後能夠再次執行進入鎖所相關的代碼而不會阻塞,只是count+1。性能
一、ReentrantLock的鎖釋放須要代碼層面的lock(),unLock(),final(),必須將unLock()放到final中,而synchronized是JVM層面的,出現異常後會自動釋放鎖學習
二、ReentranLock有多種方式,線程
a) lock(), 若是獲取了鎖當即返回,若是別的線程持有鎖,當前線程則一直處於休眠狀態,直到獲取鎖htm
b) tryLock(), 若是獲取了鎖當即返回true,若是別的線程正持有鎖,當即返回false;資源
c)tryLock(long timeout,TimeUnit unit), 若是獲取了鎖定當即返回true,若是別的線程正持有鎖,會等待參數給定的時間,在等待的過程當中,若是獲取了鎖定,就返回true,若是等待超時,返回false;get
d) lockInterruptibly:若是獲取了鎖定當即返回,若是沒有獲取鎖定,當前線程處於休眠狀態,直到或者鎖定,或者當前線程被別的線程中斷博客
三、在資源競爭不是很激烈的狀況下,Synchronized的性能要優於ReetrantLock,可是在資源競爭很激烈的狀況下,Synchronized的性能會降低幾十倍,可是ReetrantLock的性能能維持常態;it
四、ReentranLock有公平鎖和非公平鎖兩種策略實例化,公平鎖是指當前線程A在擁有鎖的時候,其餘線程如B來申請會等待,等A釋放的時候,會優先考慮B,而非公平的時候,是在A釋放的時候,全部等待的線程一塊兒同等競爭,對於B來講是非公平的。