欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

java代碼實(shí)現(xiàn)自旋鎖,自旋鎖實(shí)現(xiàn)讀寫鎖

在 Java 程序中怎么保證多線程的運(yùn)行安全?

2.1.讀一致性

固陽(yáng)網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),固陽(yáng)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為固陽(yáng)上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的固陽(yáng)做網(wǎng)站的公司定做!

Java 中針對(duì)上述“讀不安全”的問(wèn)題提供了關(guān)鍵字 volatile 來(lái)解決問(wèn)題,被 volatile 修飾的成員變量,在內(nèi)容發(fā)生更改的時(shí)候,會(huì)通知所有線程去主內(nèi)存更新最新的值,這樣就解決了讀不安全的問(wèn)題,實(shí)現(xiàn)了讀一致性。

但是,讀一致性是無(wú)法解決寫一致性的,雖然能夠使得每個(gè)線程都能及時(shí)獲取到最新的值,但是1.1中的寫一致性問(wèn)題還是會(huì)存在。

既然如此,Java 為啥還要提供 volatile 關(guān)鍵字呢?這并非多余的存在,在某些場(chǎng)景下只需要讀一致性的話,這個(gè)關(guān)鍵字就能夠滿足需求而且性能相對(duì)還不錯(cuò),因?yàn)槠渌哪軌虮WC“讀寫”都一直的辦法,多多少少存在一些犧牲。

2.2.寫一致性

Java 提供了三種方式來(lái)保證讀寫一致性,分別是互斥鎖、自旋鎖、線程隔離。

2.2.1.互斥鎖

互斥鎖只是一個(gè)鎖概念,在其他場(chǎng)景也叫做獨(dú)占鎖、悲觀鎖等,其實(shí)就是一個(gè)意思。它是指線程之間是互斥的,某一個(gè)線程獲取了某個(gè)資源的鎖,那么其他線程就只能睡眠等待。

在 Java 中互斥鎖的實(shí)現(xiàn)一般叫做同步線程鎖,關(guān)鍵字 synchronized,它鎖住的范圍是它修飾的作用域,鎖住的對(duì)象是:當(dāng)前對(duì)象(對(duì)象鎖)或類的全部對(duì)象(類鎖)——鎖釋放前,其他線程必將阻塞,保證鎖住范圍內(nèi)的操作是原子性的,而且讀取的數(shù)據(jù)不存在一致性問(wèn)題。

對(duì)象鎖:當(dāng)它修飾方法、代碼塊時(shí),將會(huì)鎖住當(dāng)前對(duì)象

類鎖:修飾類、靜態(tài)方法時(shí),則是鎖住類的所有對(duì)象

注意:?鎖住的永遠(yuǎn)是對(duì)象,鎖住的范圍永遠(yuǎn)是 synchronized 關(guān)鍵字后面的花括號(hào)劃定的代碼域。

2.2.2.自旋鎖

自旋鎖也只是一個(gè)鎖概念,在其他場(chǎng)景也叫做樂(lè)觀鎖等。

自旋鎖本質(zhì)上是不加鎖,而是通過(guò)對(duì)比舊數(shù)據(jù)來(lái)決定是否更新:

synchronized實(shí)現(xiàn)何時(shí)使用了自旋鎖還是互斥鎖

synchronized的鎖是針對(duì)多線程的,從線程的角度去思考才能真正弄明白。

Java的synchronized使用方法總結(jié)

1. 把synchronized當(dāng)作函數(shù)修飾符時(shí)

這也就是同步方法,那這時(shí)synchronized鎖定的是哪個(gè)對(duì)象呢?它鎖定的是調(diào)用這個(gè)同步方法對(duì)象。也就是說(shuō),當(dāng)一個(gè)對(duì)象P1在不同的線程中執(zhí)行這個(gè)同步方法時(shí),它們之間會(huì)形成互斥,達(dá)到同步的效果。但是這個(gè)對(duì)象所屬的Class所產(chǎn)生的另一對(duì)象P2卻可以任意調(diào)用這個(gè)被加了synchronized關(guān)鍵字的方法。

同步塊,示例代碼如下:

public void method3(SomeObject so)

{

synchronized(so)

{

//…..

}

}

這時(shí),鎖就是so這個(gè)對(duì)象,誰(shuí)拿到這個(gè)鎖誰(shuí)就可以運(yùn)行它所控制的那段代碼。當(dāng)有一個(gè)明確的對(duì)象作為鎖時(shí),就可以這樣寫程序,但當(dāng)沒有明確的對(duì)象作為鎖,只是想讓一段代碼同步時(shí),可以創(chuàng)建一個(gè)特殊的instance變量(它得是一個(gè)對(duì)象)來(lái)充當(dāng)鎖。

3.將synchronized作用于static 函數(shù),示例代碼如下:

Class Foo

{

public synchronized static void methodAAA() // 同步的static 函數(shù)

{

//….

}

public void methodBBB()

{

synchronized(Foo.class) // class literal(類名稱字面常量)

}

}

代碼中的methodBBB()方法是把class literal作為鎖的情況,它和同步的static函數(shù)產(chǎn)生的效果是一樣的,取得的鎖很特別,是當(dāng)前調(diào)用這個(gè)方法的對(duì)象所屬的類(Class,而不再是由這個(gè)Class產(chǎn)生的某個(gè)具體對(duì)象了)。

Java鎖有哪些種類,以及區(qū)別

一、公平鎖/非公平鎖

公平鎖是指多個(gè)線程按照申請(qǐng)鎖的順序來(lái)獲取鎖。

非公平鎖是指多個(gè)線程獲取鎖的順序并不是按照申請(qǐng)鎖的順序,有可能后申請(qǐng)的線程比先申請(qǐng)的線程優(yōu)先獲取鎖。有可能,會(huì)造成優(yōu)先級(jí)反轉(zhuǎn)或者饑餓現(xiàn)象。

對(duì)于Java ReentrantLock而言,通過(guò)構(gòu)造函數(shù)指定該鎖是否是公平鎖,默認(rèn)是非公平鎖。非公平鎖的優(yōu)點(diǎn)在于吞吐量比公平鎖大。

對(duì)于Synchronized而言,也是一種非公平鎖。由于其并不像ReentrantLock是通過(guò)AQS的來(lái)實(shí)現(xiàn)線程調(diào)度,所以并沒有任何辦法使其變成公平鎖。

二、可重入鎖

可重入鎖又名遞歸鎖,是指在同一個(gè)線程在外層方法獲取鎖的時(shí)候,在進(jìn)入內(nèi)層方法會(huì)自動(dòng)獲取鎖。說(shuō)的有點(diǎn)抽象,下面會(huì)有一個(gè)代碼的示例。

對(duì)于Java ReentrantLock而言, 他的名字就可以看出是一個(gè)可重入鎖,其名字是Re entrant Lock重新進(jìn)入鎖。

對(duì)于Synchronized而言,也是一個(gè)可重入鎖??芍厝腈i的一個(gè)好處是可一定程度避免死鎖。

synchronized void setA() throws Exception{

Thread.sleep(1000);

setB();

}

synchronized void setB() throws Exception{

Thread.sleep(1000);

}

上面的代碼就是一個(gè)可重入鎖的一個(gè)特點(diǎn),如果不是可重入鎖的話,setB可能不會(huì)被當(dāng)前線程執(zhí)行,可能造成死鎖。

三、獨(dú)享鎖/共享鎖

獨(dú)享鎖是指該鎖一次只能被一個(gè)線程所持有。

共享鎖是指該鎖可被多個(gè)線程所持有。

對(duì)于Java

ReentrantLock而言,其是獨(dú)享鎖。但是對(duì)于Lock的另一個(gè)實(shí)現(xiàn)類ReadWriteLock,其讀鎖是共享鎖,其寫鎖是獨(dú)享鎖。

讀鎖的共享鎖可保證并發(fā)讀是非常高效的,讀寫,寫讀 ,寫寫的過(guò)程是互斥的。

獨(dú)享鎖與共享鎖也是通過(guò)AQS來(lái)實(shí)現(xiàn)的,通過(guò)實(shí)現(xiàn)不同的方法,來(lái)實(shí)現(xiàn)獨(dú)享或者共享。

對(duì)于Synchronized而言,當(dāng)然是獨(dú)享鎖。

四、互斥鎖/讀寫鎖

上面講的獨(dú)享鎖/共享鎖就是一種廣義的說(shuō)法,互斥鎖/讀寫鎖就是具體的實(shí)現(xiàn)。

互斥鎖在Java中的具體實(shí)現(xiàn)就是ReentrantLock

讀寫鎖在Java中的具體實(shí)現(xiàn)就是ReadWriteLock

五、樂(lè)觀鎖/悲觀鎖

樂(lè)觀鎖與悲觀鎖不是指具體的什么類型的鎖,而是指看待并發(fā)同步的角度。

悲觀鎖認(rèn)為對(duì)于同一個(gè)數(shù)據(jù)的并發(fā)操作,一定是會(huì)發(fā)生修改的,哪怕沒有修改,也會(huì)認(rèn)為修改。因此對(duì)于同一個(gè)數(shù)據(jù)的并發(fā)操作,悲觀鎖采取加鎖的形式。悲觀的認(rèn)為,不加鎖的并發(fā)操作一定會(huì)出問(wèn)題。

樂(lè)觀鎖則認(rèn)為對(duì)于同一個(gè)數(shù)據(jù)的并發(fā)操作,是不會(huì)發(fā)生修改的。在更新數(shù)據(jù)的時(shí)候,會(huì)采用嘗試更新,不斷重新的方式更新數(shù)據(jù)。樂(lè)觀的認(rèn)為,不加鎖的并發(fā)操作是沒有事情的。

從上面的描述我們可以看出,悲觀鎖適合寫操作非常多的場(chǎng)景,樂(lè)觀鎖適合讀操作非常多的場(chǎng)景,不加鎖會(huì)帶來(lái)大量的性能提升。

悲觀鎖在Java中的使用,就是利用各種鎖。

樂(lè)觀鎖在Java中的使用,是無(wú)鎖編程,常常采用的是CAS算法,典型的例子就是原子類,通過(guò)CAS自旋實(shí)現(xiàn)原子操作的更新。

六、分段鎖

分段鎖其實(shí)是一種鎖的設(shè)計(jì),并不是具體的一種鎖,對(duì)于ConcurrentHashMap而言,其并發(fā)的實(shí)現(xiàn)就是通過(guò)分段鎖的形式來(lái)實(shí)現(xiàn)高效的并發(fā)操作。

我們以ConcurrentHashMap來(lái)說(shuō)一下分段鎖的含義以及設(shè)計(jì)思想,ConcurrentHashMap中的分段鎖稱為Segment,它即類似于HashMap(JDK7與JDK8中HashMap的實(shí)現(xiàn))的結(jié)構(gòu),即內(nèi)部擁有一個(gè)Entry數(shù)組,數(shù)組中的每個(gè)元素又是一個(gè)鏈表;同時(shí)又是一個(gè)ReentrantLock(Segment繼承了ReentrantLock)。

當(dāng)需要put元素的時(shí)候,并不是對(duì)整個(gè)hashmap進(jìn)行加鎖,而是先通過(guò)hashcode來(lái)知道他要放在那一個(gè)分段中,然后對(duì)這個(gè)分段進(jìn)行加鎖,所以當(dāng)多線程put的時(shí)候,只要不是放在一個(gè)分段中,就實(shí)現(xiàn)了真正的并行的插入。

但是,在統(tǒng)計(jì)size的時(shí)候,可就是獲取hashmap全局信息的時(shí)候,就需要獲取所有的分段鎖才能統(tǒng)計(jì)。

分段鎖的設(shè)計(jì)目的是細(xì)化鎖的粒度,當(dāng)操作不需要更新整個(gè)數(shù)組的時(shí)候,就僅僅針對(duì)數(shù)組中的一項(xiàng)進(jìn)行加鎖操作。

七、偏向鎖/輕量級(jí)鎖/重量級(jí)鎖

這三種鎖是指鎖的狀態(tài),并且是針對(duì)Synchronized。在Java

5通過(guò)引入鎖升級(jí)的機(jī)制來(lái)實(shí)現(xiàn)高效Synchronized。這三種鎖的狀態(tài)是通過(guò)對(duì)象監(jiān)視器在對(duì)象頭中的字段來(lái)表明的。

偏向鎖是指一段同步代碼一直被一個(gè)線程所訪問(wèn),那么該線程會(huì)自動(dòng)獲取鎖。降低獲取鎖的代價(jià)。

輕量級(jí)鎖是指當(dāng)鎖是偏向鎖的時(shí)候,被另一個(gè)線程所訪問(wèn),偏向鎖就會(huì)升級(jí)為輕量級(jí)鎖,其他線程會(huì)通過(guò)自旋的形式嘗試獲取鎖,不會(huì)阻塞,提高性能。

重量級(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)的方式去嘗試獲取鎖,這樣的好處是減少線程上下文切換的消耗,缺點(diǎn)是循環(huán)會(huì)消耗CPU。

典型的自旋鎖實(shí)現(xiàn)的例子,可以參考自旋鎖的實(shí)現(xiàn)

本文標(biāo)題:java代碼實(shí)現(xiàn)自旋鎖,自旋鎖實(shí)現(xiàn)讀寫鎖
標(biāo)題鏈接:http://aaarwkj.com/article16/dsishdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)App設(shè)計(jì)、網(wǎng)站營(yíng)銷、全網(wǎng)營(yíng)銷推廣建站公司、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
国产中文字幕婷婷丁香| 91精品国产高清久久福利| 中文字幕五月久久婷热| 91精品国产综合久久不国产大片 | 亚洲国产精品成人久久蜜臀| 亚洲精品av一区二区久久| 青青草原高清在线观看| 亚洲成人免费电影久久| 日本在线中文字幕乱码| 日本岛国大片在线视频| 色哟哟网站一区二区精品久久| 超碰国产熟女一区二区三区 | 久久久久久成人综合色| 国产日韩熟女中文字幕| 中文字幕免费日本在线| 高清美女视频亚洲免费| 97资源视频在线播放| 97国产超碰在线观看| 免费国产黄片在线播放| 午夜草草视频在线观看| 亚洲欧美另类重口国产| 亚洲国产高清国产拍精品| 亚洲美腿丝袜综合在线| 香蕉网性欧美在线视频| 亚洲精品一区二区播放| 日本伦理三级在线观看| 中文精品字幕人妻熟女小妇 | 日本黄色录像在线观看| av免费观看一区二区三区| 后入式动漫在线观看| 日韩在线一区二区三区电影| 黄色录像日本黄色录像| 精品欧美一区二区三久久| 日本韩国亚洲欧美一区二区| 欧美日韩一区二区三区四区高清视频| 亚洲香蕉av在线一区二区三区| 熟妇激情欧美在线播放视频| 亚洲乱码一区二区av| 亚洲国产精品高清久久| 亚洲毛片在线免费播放| 日本不卡一区二区三区四|