Java并发编程实战 第13章 显式锁
接口Lock的實(shí)現(xiàn)類:
ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock
ReentrantLock
java5.0之前只有synchronize和volatile,ReentrantLock是5.0增加的。
ps:synchronize使用的監(jiān)視器鎖不是通過ReentrantLock實(shí)現(xiàn)的,是一種獨(dú)特的機(jī)制。在5.0中它的性能要比ReentrantLock低很多,在6.0中它的性能也比ReentrantLock也要低一點(diǎn)。
ReentrantLock的獨(dú)有功能:
- 可實(shí)現(xiàn)輪詢
- 可配置為定時(shí)返回
- 可配置為響應(yīng)中斷
- 可配置為公平鎖
注意:lock的unlock必須在finally中。
輪詢和定時(shí)都是通過tryLock(time)方法來實(shí)現(xiàn)的。
while(true)
{
boolean success = lock.tryLock(time);
if success
{
//獲得了鎖
//執(zhí)行代碼
break;
}
}
關(guān)于公平鎖:
此類的構(gòu)造方法接受一個(gè)可選的公平 參數(shù)。當(dāng)設(shè)置為 true 時(shí),在多個(gè)線程的爭(zhēng)用下,這些鎖定傾向于將訪問權(quán)授予等待時(shí)間最長(zhǎng)的線程。否則此鎖定將無法保證任何特定訪問順序。與采用默認(rèn)設(shè)置(使用不公平鎖定)相比,使用公平鎖定的程序在許多線程訪問時(shí)表現(xiàn)為很低的總體吞吐量(即速度很慢,常常極其慢),但是在獲得鎖定和保證鎖定分配的均衡性時(shí)差異較小。不過要注意的是,公平鎖定不能保證線程調(diào)度的公平性。還要注意的是,未定時(shí)的 tryLock 方法并沒有使用公平設(shè)置。因?yàn)榧词蛊渌€程正在等待,只要該鎖定是可用的,此方法就可以獲得成功。
synchronize和ReentrantLock的選擇
ReentrantLock在性能上似乎優(yōu)于內(nèi)置鎖,但是內(nèi)置鎖仍然具有很大的優(yōu)勢(shì)。內(nèi)置鎖為許多開發(fā)人員所熟悉,并且簡(jiǎn)介緊湊,而且許多現(xiàn)有的程序都已經(jīng)使用了內(nèi)置鎖,如果將這兩種機(jī)制混合使用,那么不僅容易令人困惑,也容易發(fā)生錯(cuò)誤。
而且synchronize更加的簡(jiǎn)單,JVM會(huì)對(duì)它有特殊的優(yōu)化。
所以作者建議優(yōu)先選擇synchronize。
讀寫鎖
寫鎖獨(dú)占讀寫操作。讀鎖之間可以共享。
讀寫鎖本身的實(shí)現(xiàn)會(huì)有負(fù)擔(dān),所以一般在讀操作比較多的情況下使用。如果不是這種情況,最好測(cè)試后再做決定。
ReentrantReadWriteLock:
此類具有以下屬性:
- 獲取順序
當(dāng)設(shè)置為公平鎖時(shí),線程利用一個(gè)近似到達(dá)順序的策略來爭(zhēng)奪進(jìn)入。當(dāng)釋放寫入鎖定后,將寫入鎖定分配給等待時(shí)間最長(zhǎng)的單個(gè)寫入者,如果有一個(gè)等待時(shí)間比所有寫入者更長(zhǎng)的讀取者,則將讀取鎖定分配給讀取者 set。當(dāng)非公平地構(gòu)造線程時(shí),則不需要按照到達(dá)順序進(jìn)入鎖定。不管是哪一種情況,如果讀取者處于活動(dòng)狀態(tài),而某個(gè)寫入者進(jìn)入鎖定狀態(tài),那么在獲取寫入者并釋放寫入鎖定之前,不會(huì)將讀取鎖定授予任何后續(xù)的讀取者。我的理解:也就是說,寫入鎖具有優(yōu)先獲取鎖的特權(quán),雖然在公平鎖的情況下,這個(gè)特權(quán)會(huì)削弱,但是依然有。
- 重入
此鎖定允許讀取者和寫入者按照 ReentrantLock 的樣式重新獲取讀取鎖定或?qū)懭腈i定。在寫入線程保持的所有寫入鎖定都已經(jīng)釋放后,才允許寫入者使用它們。
- 鎖定降級(jí)
重入還允許從寫入鎖定降級(jí)為讀取鎖定,其實(shí)現(xiàn)方式是:先獲取寫入鎖定,然后獲取讀取鎖定,最后釋放寫入鎖定。但是,從讀取鎖定升級(jí)到寫入鎖定是不可能的。
- 鎖定獲取的中斷
讀取鎖定和寫入鎖定都支持鎖定獲取期間的中斷。
- Condition 支持
寫入鎖定提供了一個(gè) Condition 實(shí)現(xiàn),對(duì)于寫入鎖定來說,該實(shí)現(xiàn)的行為與 ReentrantLock.newCondition() 提供的 Condition 實(shí)現(xiàn)對(duì) ReentrantLock 所做的行為相同。當(dāng)然,此 Condition 只能用于寫入鎖定。
讀取鎖定不支持 Condition,readLock().newCondition() 會(huì)拋出 UnsupportedOperationException。
- 序列化
此類行為的序列化方式與內(nèi)置鎖定的相同:反序列化的鎖定處于解除鎖定狀態(tài),無論序列化該鎖定時(shí)其狀態(tài)如何。
?
轉(zhuǎn)載于:https://www.cnblogs.com/xiaolang8762400/p/7074392.html
總結(jié)
以上是生活随笔為你收集整理的Java并发编程实战 第13章 显式锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj 3590 The shuffle
- 下一篇: Java并发程序设计(八)设计模式与并发