色欲av一区久久精品_久久综合色综合色88_无码在线观看不卡_色黄视频网站_亚洲国产精品久久久久秋霞66

Java中的鎖分類

時(shí)間:2023-05-17

在讀很多并發(fā)文章中,會(huì)提及各種各樣鎖如公平鎖,悲觀鎖等等,這篇文章引見各種鎖的分類。引見的內(nèi)容如下:
公平鎖/非公平鎖
可重入鎖
獨(dú)享鎖/共享鎖
互斥鎖/讀寫鎖
悲觀鎖/悲觀鎖
分段鎖
傾向鎖/輕量級(jí)鎖/重量級(jí)鎖
自旋鎖
上面是很多鎖的名詞,這些分類并不是全是指鎖的狀態(tài),有的指鎖的特性,有的指鎖的設(shè)計(jì),下面總結(jié)的內(nèi)容是對(duì)每個(gè)鎖的名詞停止一定的解釋。
公平鎖/非公平鎖
公平鎖是指多個(gè)線程依照申請(qǐng)鎖的次第來獲取鎖。
非公平鎖是指多個(gè)線程獲取鎖的次第并不是依照申請(qǐng)鎖的次第,有可能后申請(qǐng)的線程比先申請(qǐng)的線程優(yōu)先獲取鎖。有可能,會(huì)形成優(yōu)先級(jí)反轉(zhuǎn)或者饑餓現(xiàn)象。
關(guān)于JavaReentrantLock而言,經(jīng)過結(jié)構(gòu)函數(shù)指定該鎖能否是公平鎖,默許是非公平鎖。非公平鎖的優(yōu)點(diǎn)在于吞吐量比公平鎖大。
關(guān)于Synchronized而言,也是一種非公平鎖。由于其并不像ReentrantLock是經(jīng)過AQS的來完成線程調(diào)度,所以并沒有任何方法使其變成公平鎖。java
可重入鎖
可重入鎖又名遞歸鎖,是指在同一個(gè)線程在外層辦法獲取鎖的時(shí)分,在進(jìn)入內(nèi)層辦法會(huì)自動(dòng)獲取鎖。說的有點(diǎn)籠統(tǒng),下面會(huì)有一個(gè)代碼的示例。
關(guān)于JavaReentrantLock而言,他的名字就能夠看出是一個(gè)可重入鎖,其名字是ReentrantLock重新進(jìn)入鎖。
關(guān)于Synchronized而言,也是一個(gè)可重入鎖??芍厝腈i的一個(gè)益處是可一定水平防止死鎖。
synchronizedvoidsetA()throwsException{
Thread.sleep(1000);
setB();
}
synchronizedvoidsetB()throwsException{
Thread.sleep(1000);
}
上面的代碼就是一個(gè)可重入鎖的一個(gè)特性,假如不是可重入鎖的話,setB可能不會(huì)被當(dāng)前線程執(zhí)行,可能形成死鎖。
獨(dú)享鎖/共享鎖
獨(dú)享鎖是指該鎖一次只能被一個(gè)線程所持有。
共享鎖是指該鎖可被多個(gè)線程所持有。
關(guān)于JavaReentrantLock而言,其是獨(dú)享鎖。但是關(guān)于Lock的另一個(gè)完成類ReadWriteLock,其讀鎖是共享鎖,其寫鎖是獨(dú)享鎖。
讀鎖的共享鎖可保證并發(fā)讀是十分高效的,讀寫,寫讀,寫寫的過程是互斥的。
獨(dú)享鎖與共享鎖也是經(jīng)過AQS來完成的,經(jīng)過完成不同的辦法,來完成獨(dú)享或者共享。
關(guān)于Synchronized而言,當(dāng)然是獨(dú)享鎖。
互斥鎖/讀寫鎖
上面講的獨(dú)享鎖/共享鎖就是一種廣義的說法,互斥鎖/讀寫鎖就是詳細(xì)的完成。
互斥鎖在Java中的詳細(xì)完成就是ReentrantLock
讀寫鎖在Java中的詳細(xì)完成就是ReadWriteLock
悲觀鎖/悲觀鎖
悲觀鎖:假定會(huì)發(fā)作并發(fā)抵觸,屏蔽一切可能違背數(shù)據(jù)完好性的操作。[1]
悲觀鎖:假定不會(huì)發(fā)作并發(fā)抵觸,只在提交操作時(shí)檢查能否違背數(shù)據(jù)完好性。[1]悲觀鎖不能處理臟讀的問題
悲觀鎖與悲觀鎖不是指詳細(xì)的什么類型的鎖,而是指對(duì)待并發(fā)同步的角度。
悲觀鎖以為關(guān)于同一個(gè)數(shù)據(jù)的并發(fā)操作,一定是會(huì)發(fā)作修正的,哪怕沒有修正,也會(huì)以為修正。因而關(guān)于同一個(gè)數(shù)據(jù)的并發(fā)操作,悲觀鎖采取加鎖的方式。悲觀的以為,不加鎖的并發(fā)操作一定會(huì)出問題。
悲觀鎖則以為關(guān)于同一個(gè)數(shù)據(jù)的并發(fā)操作,是不會(huì)發(fā)作修正的。在更新數(shù)據(jù)的時(shí)分,會(huì)采用嘗試更新,不時(shí)重新的方式更新數(shù)據(jù)。悲觀的以為,不加鎖的并發(fā)操作是沒有事情的。
從上面的描繪我們能夠看出,悲觀鎖合適寫操作十分多的場(chǎng)景,悲觀鎖合適讀操作十分多的場(chǎng)景,不加鎖會(huì)帶來大量的性能提升。
悲觀鎖在Java中的運(yùn)用,就是應(yīng)用各種鎖。
悲觀鎖在Java中的運(yùn)用,是無鎖編程,常常采用的是CAS算法,典型的例子就是原子類,經(jīng)過CAS自旋完成原子操作的更新。
分段鎖
分段鎖其實(shí)是一種鎖的設(shè)計(jì),并不是詳細(xì)的一種鎖,關(guān)于ConcurrentHashMap而言,其并發(fā)的完成就是經(jīng)過分段鎖的方式來完成高效的并發(fā)操作。
我們以ConcurrentHashMap來說一下分段鎖的含義以及設(shè)計(jì)思想,ConcurrentHashMap中的分段鎖稱為Segment,它即相似于HashMap(JDK7與JDK8中HashMap的完成)的構(gòu)造,即內(nèi)部具有一個(gè)Entry數(shù)組,數(shù)組中的每個(gè)元素又是一個(gè)鏈表;同時(shí)又是一個(gè)ReentrantLock(Segment繼承了ReentrantLock)。
當(dāng)需求put元素的時(shí)分,并不是對(duì)整個(gè)hashmap停止加鎖,而是先經(jīng)過hashcode來曉得他要放在那一個(gè)分段中,然后對(duì)這個(gè)分段停止加鎖,所以當(dāng)多線程put的時(shí)分,只需不是放在一個(gè)分段中,就完成了真正的并行的插入。
但是,在統(tǒng)計(jì)size的時(shí)分,可就是獲取hashmap全局信息的時(shí)分,就需求獲取一切的分段鎖才干統(tǒng)計(jì)。
分段鎖的設(shè)計(jì)目的是細(xì)化鎖的粒度,當(dāng)操作不需求更新整個(gè)數(shù)組的時(shí)分,就僅僅針對(duì)數(shù)組中的一項(xiàng)停止加鎖操作。
傾向鎖/輕量級(jí)鎖/重量級(jí)鎖
這三種鎖是指鎖的狀態(tài),并且是針對(duì)Synchronized。在Java5經(jīng)過引入鎖晉級(jí)的機(jī)制來完成高效Synchronized。這三種鎖的狀態(tài)是經(jīng)過對(duì)象監(jiān)視器在對(duì)象頭中的字段來標(biāo)明的。
傾向鎖是指一段同步代碼不斷被一個(gè)線程所訪問,那么該線程會(huì)自動(dòng)獲取鎖。降低獲取鎖的代價(jià)。
輕量級(jí)鎖是指當(dāng)鎖是傾向鎖的時(shí)分,被另一個(gè)線程所訪問,傾向鎖就會(huì)晉級(jí)為輕量級(jí)鎖,其他線程會(huì)經(jīng)過自旋的方式嘗試獲取鎖,不會(huì)阻塞,進(jìn)步性能。
重量級(jí)鎖是指當(dāng)鎖為輕量級(jí)鎖的時(shí)分,另一個(gè)線程固然是自旋,但自旋不會(huì)不斷持續(xù)下去,當(dāng)自旋一定次數(shù)的時(shí)分,還沒有獲取到鎖,就會(huì)進(jìn)入阻塞,該鎖收縮為重量級(jí)鎖。重量級(jí)鎖會(huì)讓其他申請(qǐng)的線程進(jìn)入阻塞,性能降低。
自旋鎖
在Java中,自旋鎖是指嘗試獲取鎖的線程不會(huì)立刻阻塞,而是采用循環(huán)的方式去嘗試獲取鎖,這樣的益處是減少線程上下文切換的耗費(fèi),缺陷是循環(huán)會(huì)耗費(fèi)CPU。

文章標(biāo)簽:

Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)

與項(xiàng)目經(jīng)理交流
掃描二維碼
與項(xiàng)目經(jīng)理交流
掃描二維碼
與項(xiàng)目經(jīng)理交流
ciya68