java多線(xiàn)程之讀寫(xiě)鎖

Lock比傳統(tǒng)線(xiàn)程模型中的synchronized方式更加面向?qū)ο螅c生活中的鎖類(lèi)似区拳,鎖本身也應(yīng)該是一個(gè)對(duì)象课竣。兩個(gè)線(xiàn)程執(zhí)行的代碼片段要實(shí)現(xiàn)同步互斥的效果,它們必須用同一個(gè)Lock對(duì)象膝晾。

讀寫(xiě)鎖:分為讀鎖和寫(xiě)鎖,多個(gè)讀鎖不互斥务冕,讀鎖與寫(xiě)鎖互斥血当,這是由jvm自己控制的,你只要上好相應(yīng)的鎖即可洒疚。如果你的代碼只讀數(shù)據(jù)歹颓,可以很多人同時(shí)讀,但不能同時(shí)寫(xiě)油湖,那就上讀鎖巍扛;如果你的代碼修改數(shù)據(jù),只能有一個(gè)人在寫(xiě)乏德,且不能同時(shí)讀取撤奸,那就上寫(xiě)鎖吠昭。總之胧瓜,讀的時(shí)候上讀鎖矢棚,寫(xiě)的時(shí)候上寫(xiě)鎖!

ReentrantReadWriteLock會(huì)使用兩把鎖來(lái)解決問(wèn)題府喳,一個(gè)讀鎖蒲肋,一個(gè)寫(xiě)鎖

線(xiàn)程進(jìn)入讀鎖的前提條件:

沒(méi)有其他線(xiàn)程的寫(xiě)鎖,

沒(méi)有寫(xiě)請(qǐng)求或者有寫(xiě)請(qǐng)求钝满,但調(diào)用線(xiàn)程和持有鎖的線(xiàn)程是同一個(gè)

線(xiàn)程進(jìn)入寫(xiě)鎖的前提條件:

沒(méi)有其他線(xiàn)程的讀鎖

沒(méi)有其他線(xiàn)程的寫(xiě)鎖

到ReentrantReadWriteLock兜粘,首先要做的是與ReentrantLock劃清界限。它和后者都是單獨(dú)的實(shí)現(xiàn)弯蚜,彼此之間沒(méi)有繼承或?qū)崿F(xiàn)的關(guān)系孔轴。然后就是總結(jié)這個(gè)鎖機(jī)制的特性了:

(a).重入方面其內(nèi)部的WriteLock可以獲取ReadLock,但是反過(guò)來(lái)ReadLock想要獲得WriteLock則永遠(yuǎn)都不要想碎捺。

(b).WriteLock可以降級(jí)為ReadLock路鹰,順序是:先獲得WriteLock再獲得ReadLock,然后釋放WriteLock收厨,這時(shí)候線(xiàn)程將保持Readlock的持有晋柱。反過(guò)來(lái)ReadLock想要升級(jí)為WriteLock則不可能,為什么帽氓?參看(a)趣斤,呵呵.

(c).ReadLock可以被多個(gè)線(xiàn)程持有并且在作用時(shí)排斥任何的WriteLock俩块,而WriteLock則是完全的互斥黎休。這一特性最為重要,因?yàn)閷?duì)于高讀取頻率而相對(duì)較低寫(xiě)入的數(shù)據(jù)結(jié)構(gòu)玉凯,使用此類(lèi)鎖同步機(jī)制則可以提高并發(fā)量势腮。

(d).不管是ReadLock還是WriteLock都支持Interrupt,語(yǔ)義與ReentrantLock一致漫仆。

(e).WriteLock支持Condition并且與ReentrantLock語(yǔ)義一致捎拯,而ReadLock則不能使用Condition,否則拋出UnsupportedOperationException異常盲厌。

例子:

public class CacheDemo {? ? private Mapmap = new HashMap();//緩存器

private ReadWriteLock rwl = new ReentrantReadWriteLock();

public static void main(String[] args) {

}

public Object get(String id){

Object value = null;

rwl.readLock().lock();//首先開(kāi)啟讀鎖署照,從緩存中去取

try{

value = map.get(id);

if(value == null){? //如果緩存中沒(méi)有釋放讀鎖,上寫(xiě)鎖

rwl.readLock().unlock();

rwl.writeLock().lock();

try{

if(value == null){

value = "aaa";? //此時(shí)可以去數(shù)據(jù)庫(kù)中查找吗浩,這里簡(jiǎn)單的模擬一下

}

}finally{

rwl.writeLock().unlock(); //釋放寫(xiě)鎖

}

rwl.readLock().lock(); //然后再上讀鎖

}

}finally{

rwl.readLock().unlock(); //最后釋放讀鎖

}

return value;

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末建芙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子懂扼,更是在濱河造成了極大的恐慌禁荸,老刑警劉巖右蒲,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赶熟,居然都是意外死亡瑰妄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)映砖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)间坐,“玉大人,你說(shuō)我怎么就攤上這事邑退】粽” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瓜饥,是天一觀的道長(zhǎng)逝撬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)乓土,這世上最難降的妖魔是什么宪潮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮趣苏,結(jié)果婚禮上狡相,老公的妹妹穿的比我還像新娘。我一直安慰自己食磕,他們只是感情好尽棕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著彬伦,像睡著了一般滔悉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上单绑,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天回官,我揣著相機(jī)與錄音,去河邊找鬼搂橙。 笑死歉提,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的区转。 我是一名探鬼主播苔巨,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼废离!你這毒婦竟也來(lái)了侄泽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厅缺,失蹤者是張志新(化名)和其女友劉穎蔬顾,沒(méi)想到半個(gè)月后宴偿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诀豁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年窄刘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舷胜。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娩践,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烹骨,到底是詐尸還是另有隱情翻伺,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布沮焕,位于F島的核電站吨岭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏峦树。R本人自食惡果不足惜辣辫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望魁巩。 院中可真熱鬧急灭,春花似錦、人聲如沸谷遂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肾扰。三九已至畴嘶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間白对,已是汗流浹背掠廓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甩恼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓沉颂,卻偏偏與公主長(zhǎng)得像条摸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铸屉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容