gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

圖文詳解!java中鎖的整理總結(jié)

本篇文章給大家?guī)砹岁P(guān)于java的相關(guān)知識(shí),其中主要介紹了關(guān)于鎖的相關(guān)內(nèi)容,包括了樂觀鎖、悲觀鎖、獨(dú)占鎖、共享鎖等等,下面一起來看一下,希望對(duì)大家有幫助。

圖文詳解!java中鎖的整理總結(jié)

推薦學(xué)習(xí):《java視頻教程》

樂觀鎖和悲觀鎖

悲觀鎖

悲觀鎖對(duì)應(yīng)于生活中悲觀的人,悲觀的人總是想著事情往壞的方向發(fā)展。

舉個(gè)生活中的例子,假設(shè)廁所只有一個(gè)坑位了,悲觀鎖上廁所會(huì)第一時(shí)間把門反鎖上,這樣其他人上廁所只能在門外等候,這種狀態(tài)就是「阻塞」了。

回到代碼世界中,一個(gè)共享數(shù)據(jù)加了悲觀鎖,那線程每次想操作這個(gè)數(shù)據(jù)前都會(huì)假設(shè)其他線程也可能會(huì)操作這個(gè)數(shù)據(jù),所以每次操作前都會(huì)上鎖,這樣其他線程想操作這個(gè)數(shù)據(jù)拿不到鎖只能阻塞了。

圖文詳解!java中鎖的整理總結(jié)

在 Java 語言中 synchronizedReentrantLock等就是典型的悲觀鎖,還有一些使用了 synchronized 關(guān)鍵字的容器類如 HashTable 等也是悲觀鎖的應(yīng)用。

樂觀鎖

樂觀鎖 對(duì)應(yīng)于生活中樂觀的人,樂觀的人總是想著事情往好的方向發(fā)展。

舉個(gè)生活中的例子,假設(shè)廁所只有一個(gè)坑位了,樂觀鎖認(rèn)為:這荒郊野外的,又沒有什么人,不會(huì)有人搶我坑位的,每次關(guān)門上鎖多浪費(fèi)時(shí)間,還是不加鎖好了。你看樂觀鎖就是天生樂觀!

回到代碼世界中,樂觀鎖操作數(shù)據(jù)時(shí)不會(huì)上鎖,在更新的時(shí)候會(huì)判斷一下在此期間是否有其他線程去更新這個(gè)數(shù)據(jù)。

圖文詳解!java中鎖的整理總結(jié)

樂觀鎖可以使用版本號(hào)機(jī)制CAS算法實(shí)現(xiàn)。在 Java 語言中 java.util.concurrent.atomic包下的原子類就是使用CAS 樂觀鎖實(shí)現(xiàn)的。

兩種鎖的使用場(chǎng)景

悲觀鎖和樂觀鎖沒有孰優(yōu)孰劣,有其各自適應(yīng)的場(chǎng)景。

樂觀鎖適用于寫比較少(沖突比較小)的場(chǎng)景,因?yàn)椴挥蒙湘i、釋放鎖,省去了鎖的開銷,從而提升了吞吐量。

如果是寫多讀少的場(chǎng)景,即沖突比較嚴(yán)重,線程間競(jìng)爭(zhēng)激勵(lì),使用樂觀鎖就是導(dǎo)致線程不斷進(jìn)行重試,這樣可能還降低了性能,這種場(chǎng)景下使用悲觀鎖就比較合適。

獨(dú)占鎖和共享鎖

獨(dú)占鎖

獨(dú)占鎖是指鎖一次只能被一個(gè)線程所持有。如果一個(gè)線程對(duì)數(shù)據(jù)加上排他鎖后,那么其他線程不能再對(duì)該數(shù)據(jù)加任何類型的鎖。獲得獨(dú)占鎖的線程即能讀數(shù)據(jù)又能修改數(shù)據(jù)。

圖文詳解!java中鎖的整理總結(jié)

JDK中的synchronizedjava.util.concurrent(JUC)包中Lock的實(shí)現(xiàn)類就是獨(dú)占鎖。

共享鎖

共享鎖是指鎖可被多個(gè)線程所持有。如果一個(gè)線程對(duì)數(shù)據(jù)加上共享鎖后,那么其他線程只能對(duì)數(shù)據(jù)再加共享鎖,不能加獨(dú)占鎖。獲得共享鎖的線程只能讀數(shù)據(jù),不能修改數(shù)據(jù)。

圖文詳解!java中鎖的整理總結(jié)

在 JDK 中 ReentrantReadWriteLock 就是一種共享鎖。

互斥鎖和讀寫鎖

互斥鎖

互斥鎖是獨(dú)占鎖的一種常規(guī)實(shí)現(xiàn),是指某一資源同時(shí)只允許一個(gè)訪問者對(duì)其進(jìn)行訪問,具有唯一性和排它性。

圖文詳解!java中鎖的整理總結(jié)

互斥鎖一次只能一個(gè)線程擁有互斥鎖,其他線程只有等待。

讀寫鎖

讀寫鎖是共享鎖的一種具體實(shí)現(xiàn)。讀寫鎖管理一組鎖,一個(gè)是只讀的鎖,一個(gè)是寫鎖。

讀鎖可以在沒有寫鎖的時(shí)候被多個(gè)線程同時(shí)持有,而寫鎖是獨(dú)占的。寫鎖的優(yōu)先級(jí)要高于讀鎖,一個(gè)獲得了讀鎖的線程必須能看到前一個(gè)釋放的寫鎖所更新的內(nèi)容。

讀寫鎖相比于互斥鎖并發(fā)程度更高,每次只有一個(gè)寫線程,但是同時(shí)可以有多個(gè)線程并發(fā)讀。

圖文詳解!java中鎖的整理總結(jié)

在 JDK 中定義了一個(gè)讀寫鎖的接口:ReadWriteLock

public interface ReadWriteLock {     /**      * 獲取讀鎖      */     Lock readLock();      /**      * 獲取寫鎖      */     Lock writeLock(); }

ReentrantReadWriteLock 實(shí)現(xiàn)了ReadWriteLock接口,具體實(shí)現(xiàn)這里不展開,后續(xù)會(huì)深入源碼解析。

公平鎖和非公平鎖

公平鎖

公平鎖是指多個(gè)線程按照申請(qǐng)鎖的順序來獲取鎖,這里類似排隊(duì)買票,先來的人先買,后來的人在隊(duì)尾排著,這是公平的。

圖文詳解!java中鎖的整理總結(jié)

在 java 中可以通過構(gòu)造函數(shù)初始化公平鎖

/** * 創(chuàng)建一個(gè)可重入鎖,true 表示公平鎖,false 表示非公平鎖。默認(rèn)非公平鎖 */ Lock lock = new ReentrantLock(true);

非公平鎖

非公平鎖是指多個(gè)線程獲取鎖的順序并不是按照申請(qǐng)鎖的順序,有可能后申請(qǐng)的線程比先申請(qǐng)的線程優(yōu)先獲取鎖,在高并發(fā)環(huán)境下,有可能造成優(yōu)先級(jí)翻轉(zhuǎn),或者饑餓的狀態(tài)(某個(gè)線程一直得不到鎖)。

圖文詳解!java中鎖的整理總結(jié)

在 java 中 synchronized 關(guān)鍵字是非公平鎖,ReentrantLock默認(rèn)也是非公平鎖。

/** * 創(chuàng)建一個(gè)可重入鎖,true 表示公平鎖,false 表示非公平鎖。默認(rèn)非公平鎖 */ Lock lock = new ReentrantLock(false);

可重入鎖

可重入鎖又稱之為遞歸鎖,是指同一個(gè)線程在外層方法獲取了鎖,在進(jìn)入內(nèi)層方法會(huì)自動(dòng)獲取鎖。

圖文詳解!java中鎖的整理總結(jié)

對(duì)于Java ReentrantLock而言, 他的名字就可以看出是一個(gè)可重入鎖。對(duì)于Synchronized而言,也是一個(gè)可重入鎖。

敲黑板:可重入鎖的一個(gè)好處是可一定程度避免死鎖。

以 synchronized 為例,看一下下面的代碼:

public synchronized void mehtodA() throws Exception{  // Do some magic tings  mehtodB(); }  public synchronized void mehtodB() throws Exception{  // Do some magic tings }

上面的代碼中 methodA 調(diào)用 methodB,如果一個(gè)線程調(diào)用methodA 已經(jīng)獲取了鎖再去調(diào)用 methodB 就不需要再次獲取鎖了,這就是可重入鎖的特性。如果不是可重入鎖的話,mehtodB 可能不會(huì)被當(dāng)前線程執(zhí)行,可能造成死鎖。

自旋鎖

自旋鎖是指線程在沒有獲得鎖時(shí)不是被直接掛起,而是執(zhí)行一個(gè)忙循環(huán),這個(gè)忙循環(huán)就是所謂的自旋。

圖文詳解!java中鎖的整理總結(jié)

自旋鎖的目的是為了減少線程被掛起的幾率,因?yàn)榫€程的掛起和喚醒也都是耗資源的操作。

如果鎖被另一個(gè)線程占用的時(shí)間比較長,即使自旋了之后當(dāng)前線程還是會(huì)被掛起,忙循環(huán)就會(huì)變成浪費(fèi)系統(tǒng)資源的操作,反而降低了整體性能。因此自旋鎖是不適應(yīng)鎖占用時(shí)間長的并發(fā)情況的。

在 Java 中,AtomicInteger 類有自旋的操作,我們看一下代碼:

public final int getAndAddInt(Object o, long offset, int delta) {     int v;     do {         v = getIntVolatile(o, offset);     } while (!compareAndSwapInt(o, offset, v, v + delta));     return v; }

CAS 操作如果失敗就會(huì)一直循環(huán)獲取當(dāng)前 value 值然后重試。

另外自適應(yīng)自旋鎖也需要了解一下。

在JDK1.6又引入了自適應(yīng)自旋,這個(gè)就比較智能了,自旋時(shí)間不再固定,由前一次在同一個(gè)鎖上的自旋時(shí)間以及鎖的擁有者的狀態(tài)來決定。如果虛擬機(jī)認(rèn)為這次自旋也很有可能再次成功那就會(huì)次序較多的時(shí)間,如果自旋很少成功,那以后可能就直接省略掉自旋過程,避免浪費(fèi)處理器資源。

分段鎖

分段鎖 是一種鎖的設(shè)計(jì),并不是具體的一種鎖。

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

圖文詳解!java中鎖的整理總結(jié)

在 Java 語言中 CurrentHashMap 底層就用了分段鎖,使用Segment,就可以進(jìn)行并發(fā)使用了。

鎖升級(jí)(無鎖|偏向鎖|輕量級(jí)鎖|重量級(jí)鎖)

JDK1.6 為了提升性能減少獲得鎖和釋放鎖所帶來的消耗,引入了4種鎖的狀態(tài):無鎖偏向鎖輕量級(jí)鎖重量級(jí)鎖,它會(huì)隨著多線程的競(jìng)爭(zhēng)情況逐漸升級(jí),但不能降級(jí)。

無鎖

無鎖狀態(tài)其實(shí)就是上面講的樂觀鎖,這里不再贅述。

偏向鎖

Java偏向鎖(Biased Locking)是指它會(huì)偏向于第一個(gè)訪問鎖的線程,如果在運(yùn)行過程中,只有一個(gè)線程訪問加鎖的資源,不存在多線程競(jìng)爭(zhēng)的情況,那么線程是不需要重復(fù)獲取鎖的,這種情況下,就會(huì)給線程加一個(gè)偏向鎖。

偏向鎖的實(shí)現(xiàn)是通過控制對(duì)象Mark Word的標(biāo)志位來實(shí)現(xiàn)的,如果當(dāng)前是可偏向狀態(tài),需要進(jìn)一步判斷對(duì)象頭存儲(chǔ)的線程 ID 是否與當(dāng)前線程 ID 一致,如果一致直接進(jìn)入。

輕量級(jí)鎖

當(dāng)線程競(jìng)爭(zhēng)變得比較激烈時(shí),偏向鎖就會(huì)升級(jí)為輕量級(jí)鎖,輕量級(jí)鎖認(rèn)為雖然競(jìng)爭(zhēng)是存在的,但是理想情況下競(jìng)爭(zhēng)的程度很低,通過自旋方式等待上一個(gè)線程釋放鎖。

重量級(jí)鎖

如果線程并發(fā)進(jìn)一步加劇,線程的自旋超過了一定次數(shù),或者一個(gè)線程持有鎖,一個(gè)線程在自旋,又來了第三個(gè)線程訪問時(shí)(反正就是競(jìng)爭(zhēng)繼續(xù)加大了),輕量級(jí)鎖就會(huì)膨脹為重量級(jí)鎖,重量級(jí)鎖會(huì)使除了此時(shí)擁有鎖的線程以外的線程都阻塞。

升級(jí)到重量級(jí)鎖其實(shí)就是互斥鎖了,一個(gè)線程拿到鎖,其余線程都會(huì)處于阻塞等待狀態(tài)。

在 Java 中,synchronized 關(guān)鍵字內(nèi)部實(shí)現(xiàn)原理就是鎖升級(jí)的過程:無鎖 –> 偏向鎖 –> 輕量級(jí)鎖 –> 重量級(jí)鎖。這一過程在后續(xù)講解 synchronized 關(guān)鍵字的原理時(shí)會(huì)詳細(xì)介紹。

鎖優(yōu)化技術(shù)(鎖粗化、鎖消除)

鎖粗化

鎖粗化就是將多個(gè)同步塊的數(shù)量減少,并將單個(gè)同步塊的作用范圍擴(kuò)大,本質(zhì)上就是將多次上鎖、解鎖的請(qǐng)求合并為一次同步請(qǐng)求。

舉個(gè)例子,一個(gè)循環(huán)體中有一個(gè)代碼同步塊,每次循環(huán)都會(huì)執(zhí)行加鎖解鎖操作。

private static final Object LOCK = new Object();  for(int i = 0;i < 100; i++) {     synchronized(LOCK){         // do some magic things     } }

經(jīng)過鎖粗化后就變成下面這個(gè)樣子了:

 synchronized(LOCK){      for(int i = 0;i < 100; i++) {         // do some magic things     } }

鎖消除

鎖消除是指虛擬機(jī)編譯器在運(yùn)行時(shí)檢測(cè)到了共享數(shù)據(jù)沒有競(jìng)爭(zhēng)的鎖,從而將這些鎖進(jìn)行消除。

舉個(gè)例子讓大家更好理解。

public String test(String s1, String s2){     StringBuffer stringBuffer = new StringBuffer();     stringBuffer.append(s1);     stringBuffer.append(s2);     return stringBuffer.toString(); }

上面代碼中有一個(gè) test 方法,主要作用是將字符串 s1 和字符串 s2 串聯(lián)起來。

test 方法中三個(gè)變量s1, s2, stringBuffer, 它們都是局部變量,局部變量是在棧上的,棧是線程私有的,所以就算有多個(gè)線程訪問 test 方法也是線程安全的。

我們都知道 StringBuffer 是線程安全的類,append 方法是同步方法,但是 test 方法本來就是線程安全的,為了提升效率,虛擬機(jī)幫我們消除了這些同步鎖,這個(gè)過程就被稱為鎖消除

StringBuffer.class  // append 是同步方法 public synchronized StringBuffer append(String str) {     toStringCache = null;     super.append(str);     return this; }

一張圖總結(jié):

Java 并發(fā)編程的知識(shí)非常多,同時(shí)也是 Java 面試的高頻考點(diǎn),面試官必問的,需要學(xué)習(xí) Java 并發(fā)編程其他知識(shí)的小伙伴可以去下載『阿里師兄總結(jié)的Java知識(shí)筆記 總共 283 頁,超級(jí)詳細(xì)』。

前面講了 Java 語言中各種各種的鎖,最后再通過六個(gè)問題統(tǒng)一總結(jié)一下:

圖文詳解!java中鎖的整理總結(jié)

推薦學(xué)習(xí):《java視頻教程》

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
日本大片免费看| 久久久久久三级| 成人一对一视频| www.国产视频.com| 五月天色婷婷综合| 欧美精品99久久| 丝袜制服一区二区三区| 欧美a级黄色大片| 日韩国产欧美亚洲| 福利网在线观看| 在线免费视频a| wwwxxx黄色片| 给我免费播放片在线观看| 在线观看免费不卡av| 欧洲av无码放荡人妇网站| 国产视频在线观看网站| 国产乱女淫av麻豆国产| www.亚洲高清| 激情五月亚洲色图| 黑鬼大战白妞高潮喷白浆| 色呦呦网站入口| 国产情侣第一页| 免费人成自慰网站| www.欧美黄色| 蜜臀av.com| 久久久一二三四| 国产成人在线综合| 中文字幕第三区| 国产黄色激情视频| 日韩精品在线观看av| 久久久久久久片| 一本—道久久a久久精品蜜桃| 伊人免费视频二| 黄大色黄女片18第一次| 妓院一钑片免看黄大片| 亚洲视频在线a| 成人高清在线观看视频| 色婷婷.com| www.在线观看av| 污网站在线免费| 97超碰在线视| 亚洲欧美久久久久| 久久久久久久久久伊人| 日韩av综合在线观看| 亚洲一区二区三区四区五区| 国产内射老熟女aaaa| 中文字幕第38页| 黄色一级在线视频| www.亚洲一区二区| 性欧美极品xxxx欧美一区二区| 水蜜桃在线免费观看| 久久久精品高清| 中文字幕22页| 欧美性猛交xxx乱久交| 欧美一级在线看| www插插插无码视频网站| 超碰在线超碰在线| 亚洲欧美日韩精品一区| 99草草国产熟女视频在线| 亚洲 自拍 另类小说综合图区| 看全色黄大色大片| 天天操精品视频| 国产在线视频三区| 亚洲精品国产suv一区88| 青青青在线观看视频| 国产高清www| 日本成人中文字幕在线| 天天爱天天操天天干| 亚洲第一中文av| 911av视频| aa免费在线观看| 色一情一区二区三区| 福利网在线观看| 日本午夜激情视频| 香蕉视频999| 日韩成人三级视频| 无遮挡又爽又刺激的视频| 美女网站免费观看视频| 久久久成人精品一区二区三区| 色一情一乱一乱一区91| 成 年 人 黄 色 大 片大 全| 亚洲人成无码www久久久| 美女av免费观看| www.99av.com| 激情综合网俺也去| 日韩一二区视频| 欧美日韩一区二区三区69堂| 日韩一级片一区二区| 成人综合久久网| 国产一区亚洲二区三区| 真人抽搐一进一出视频| 神马午夜伦理影院| 天天操精品视频| 婷婷激情小说网| 午夜啪啪小视频| 一区二区久久精品| 粉嫩av一区二区三区天美传媒 | 国产又爽又黄ai换脸| 尤物国产在线观看| 九九热99视频| 亚洲一级片av| 国产91在线亚洲| 妞干网在线观看视频| www精品久久| 好男人www社区| 在线视频观看一区二区| 在线视频观看91| 国产精品一色哟哟| aⅴ在线免费观看| 中文字幕12页| 成年人观看网站| 午夜av中文字幕| 无码熟妇人妻av在线电影| 全黄性性激高免费视频| 免费在线观看日韩视频| 男人天堂成人网| 99色精品视频| 国产二区视频在线| 超碰91在线播放| 亚洲一区二区福利视频| 国产中文字幕二区| av动漫免费观看| 亚洲一区二区福利视频| 成人综合视频在线| 老司机午夜网站| 999久久久精品视频| 欧美在线aaa| 污污网站在线观看视频| 精品久久久噜噜噜噜久久图片| 国产成a人亚洲精v品在线观看| 成人性生交免费看| 亚洲怡红院在线| 日韩video| 久久精品xxx| 国产综合免费视频| 国产av人人夜夜澡人人爽麻豆 | 黄大色黄女片18第一次| 亚洲一级片免费| 国产免费色视频| 九色自拍视频在线观看| www.av蜜桃| 久久久久久久久久福利| 欧美国产日韩在线播放| 第一区免费在线观看| ijzzijzzij亚洲大全| 成人性生活视频免费看| 乌克兰美女av| 精品视频在线观看一区二区| 日韩免费毛片视频| 天天做天天干天天操| 日韩一二区视频| 亚洲综合在线网站| 青青草影院在线观看| 婷婷无套内射影院| 26uuu成人| 青青草精品视频在线观看| www成人免费| 尤物网站在线看| 免费看涩涩视频| 播放灌醉水嫩大学生国内精品| 日本精品免费视频| 奇米777在线视频| 九九热免费在线观看| 狠狠热免费视频| 日本三级免费观看| 91视频最新入口| 浮妇高潮喷白浆视频| 午夜免费福利小电影| 精品久久久久久无码中文野结衣| 午夜剧场在线免费观看| 午夜国产一区二区三区| 小泽玛利亚视频在线观看| av中文字幕网址| 福利视频999| 四虎成人在线播放| 色哟哟免费网站| 欧美变态另类刺激| 欧美极品欧美精品欧美图片| 成人性视频欧美一区二区三区| 黄色成人在线看| 精品国产成人av在线免| 8x8x成人免费视频| 免费网站在线观看视频| 91.com在线| 一区二区三区入口| 欧美狂野激情性xxxx在线观| 极品美女扒开粉嫩小泬| 一级黄色片在线免费观看| 欧美一区二区视频在线播放| 国产日韩成人内射视频| 东北少妇不带套对白| 91制片厂毛片| 在线黄色免费观看| 欧美深夜福利视频| 老司机午夜网站| 亚洲欧美激情网| www.亚洲天堂网| 青青草视频在线视频| 911福利视频| 一个色综合久久|