成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

圖文詳解!java中鎖的整理總結

本篇文章給大家帶來了關于java的相關知識,其中主要介紹了關于鎖的相關內容,包括了樂觀鎖、悲觀鎖、獨占鎖、共享鎖等等,下面一起來看一下,希望對大家有幫助。

圖文詳解!java中鎖的整理總結

推薦學習:《java視頻教程》

樂觀鎖和悲觀鎖

悲觀鎖

悲觀鎖對應于生活中悲觀的人,悲觀的人總是想著事情往壞的方向發展。

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

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

圖文詳解!java中鎖的整理總結

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

樂觀鎖

樂觀鎖 對應于生活中樂觀的人,樂觀的人總是想著事情往好的方向發展。

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

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

圖文詳解!java中鎖的整理總結

樂觀鎖可以使用版本號機制CAS算法實現。在 Java 語言中 java.util.concurrent.atomic包下的原子類就是使用CAS 樂觀鎖實現的。

兩種鎖的使用場景

悲觀鎖和樂觀鎖沒有孰優孰劣,有其各自適應的場景。

樂觀鎖適用于寫比較少(沖突比較小)的場景,因為不用上鎖、釋放鎖,省去了鎖的開銷,從而提升了吞吐量。

如果是寫多讀少的場景,即沖突比較嚴重,線程間競爭激勵,使用樂觀鎖就是導致線程不斷進行重試,這樣可能還降低了性能,這種場景下使用悲觀鎖就比較合適。

獨占鎖和共享鎖

獨占鎖

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

圖文詳解!java中鎖的整理總結

JDK中的synchronizedjava.util.concurrent(JUC)包中Lock的實現類就是獨占鎖。

共享鎖

共享鎖是指鎖可被多個線程所持有。如果一個線程對數據加上共享鎖后,那么其他線程只能對數據再加共享鎖,不能加獨占鎖。獲得共享鎖的線程只能讀數據,不能修改數據。

圖文詳解!java中鎖的整理總結

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

互斥鎖和讀寫鎖

互斥鎖

互斥鎖是獨占鎖的一種常規實現,是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。

圖文詳解!java中鎖的整理總結

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

讀寫鎖

讀寫鎖是共享鎖的一種具體實現。讀寫鎖管理一組鎖,一個是只讀的鎖,一個是寫鎖。

讀鎖可以在沒有寫鎖的時候被多個線程同時持有,而寫鎖是獨占的。寫鎖的優先級要高于讀鎖,一個獲得了讀鎖的線程必須能看到前一個釋放的寫鎖所更新的內容。

讀寫鎖相比于互斥鎖并發程度更高,每次只有一個寫線程,但是同時可以有多個線程并發讀。

圖文詳解!java中鎖的整理總結

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

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

ReentrantReadWriteLock 實現了ReadWriteLock接口,具體實現這里不展開,后續會深入源碼解析。

公平鎖和非公平鎖

公平鎖

公平鎖是指多個線程按照申請鎖的順序來獲取鎖,這里類似排隊買票,先來的人先買,后來的人在隊尾排著,這是公平的。

圖文詳解!java中鎖的整理總結

在 java 中可以通過構造函數初始化公平鎖

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

非公平鎖

非公平鎖是指多個線程獲取鎖的順序并不是按照申請鎖的順序,有可能后申請的線程比先申請的線程優先獲取鎖,在高并發環境下,有可能造成優先級翻轉,或者饑餓的狀態(某個線程一直得不到鎖)。

圖文詳解!java中鎖的整理總結

在 java 中 synchronized 關鍵字是非公平鎖,ReentrantLock默認也是非公平鎖。

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

可重入鎖

可重入鎖又稱之為遞歸鎖,是指同一個線程在外層方法獲取了鎖,在進入內層方法會自動獲取鎖。

圖文詳解!java中鎖的整理總結

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

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

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

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

上面的代碼中 methodA 調用 methodB,如果一個線程調用methodA 已經獲取了鎖再去調用 methodB 就不需要再次獲取鎖了,這就是可重入鎖的特性。如果不是可重入鎖的話,mehtodB 可能不會被當前線程執行,可能造成死鎖。

自旋鎖

自旋鎖是指線程在沒有獲得鎖時不是被直接掛起,而是執行一個忙循環,這個忙循環就是所謂的自旋。

圖文詳解!java中鎖的整理總結

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

如果鎖被另一個線程占用的時間比較長,即使自旋了之后當前線程還是會被掛起,忙循環就會變成浪費系統資源的操作,反而降低了整體性能。因此自旋鎖是不適應鎖占用時間長的并發情況的。

在 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 操作如果失敗就會一直循環獲取當前 value 值然后重試。

另外自適應自旋鎖也需要了解一下。

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

分段鎖

分段鎖 是一種鎖的設計,并不是具體的一種鎖。

分段鎖設計目的是將鎖的粒度進一步細化,當操作不需要更新整個數組的時候,就僅僅針對數組中的一項進行加鎖操作。

圖文詳解!java中鎖的整理總結

在 Java 語言中 CurrentHashMap 底層就用了分段鎖,使用Segment,就可以進行并發使用了。

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

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

無鎖

無鎖狀態其實就是上面講的樂觀鎖,這里不再贅述。

偏向鎖

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

偏向鎖的實現是通過控制對象Mark Word的標志位來實現的,如果當前是可偏向狀態,需要進一步判斷對象頭存儲的線程 ID 是否與當前線程 ID 一致,如果一致直接進入。

輕量級鎖

當線程競爭變得比較激烈時,偏向鎖就會升級為輕量級鎖,輕量級鎖認為雖然競爭是存在的,但是理想情況下競爭的程度很低,通過自旋方式等待上一個線程釋放鎖。

重量級鎖

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

升級到重量級鎖其實就是互斥鎖了,一個線程拿到鎖,其余線程都會處于阻塞等待狀態。

在 Java 中,synchronized 關鍵字內部實現原理就是鎖升級的過程:無鎖 –> 偏向鎖 –> 輕量級鎖 –> 重量級鎖。這一過程在后續講解 synchronized 關鍵字的原理時會詳細介紹。

鎖優化技術(鎖粗化、鎖消除)

鎖粗化

鎖粗化就是將多個同步塊的數量減少,并將單個同步塊的作用范圍擴大,本質上就是將多次上鎖、解鎖的請求合并為一次同步請求。

舉個例子,一個循環體中有一個代碼同步塊,每次循環都會執行加鎖解鎖操作。

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

經過鎖粗化后就變成下面這個樣子了:

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

鎖消除

鎖消除是指虛擬機編譯器在運行時檢測到了共享數據沒有競爭的鎖,從而將這些鎖進行消除。

舉個例子讓大家更好理解。

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

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

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

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

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

一張圖總結:

Java 并發編程的知識非常多,同時也是 Java 面試的高頻考點,面試官必問的,需要學習 Java 并發編程其他知識的小伙伴可以去下載『阿里師兄總結的Java知識筆記 總共 283 頁,超級詳細』。

前面講了 Java 語言中各種各種的鎖,最后再通過六個問題統一總結一下:

圖文詳解!java中鎖的整理總結

推薦學習:《java視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久久99精品成人片中文字幕| 国精产品一品二品国精破解| 人妻中出受孕 中文字幕在线| 黑人狂虐中国人妻陈艳| 国产A三级久久精品| 国产精品IGAO视频网网址| 国产老妇伦国产熟女老妇久| 狠狠综合久久久久综合网站| 国产A级三级三级三级| 国产欧美一区二区精品久久久| 娇妻强被迫伦姧惨叫 在线| 久久久久久精品无码| 欧美AⅤ精品一区二区三区| 日产精品乱码卡一卡2卡三网站| 四虎永久在线精品国产馆V视影院| 亚洲AV成人一区二区电影在线| 野花高清影视免费观看西瓜| china熟女熟妇乱老女人百度| 丰满年经的继拇6| 国内国精产品一二三区传媒| 久久无码人妻一区二区三区| 人人狠狠综合久久亚洲婷婷| 无线乱码A区B区C区| 一区二区三区精品视频日本| 白丝JK高潮喷水在线观看| 国产精品VA在线播放| 久久国产精品亚洲艾草网| 欧美性猛交乱大交3| 欧美精品双插重口在线播放| 手机在线永久免费观看AV片| 亚洲日韩亚洲另类激情文学一| 中文字幕伊人久久| 2023国精产品一二二线免费| 大荫蒂又大又长又硬又紧又粗| 国产亚洲精品第一综合另类| 含羞草传媒免费进入APP老版本| 狂躁美女大BBBBBB视频1| 两口子交换真实刺激高潮 | 野花韩国日本高清免费5| めんたいさんでぃふぇんすっ甘雨 | 欧美精欧美乱码一二三四区| 妺妺窝人体色7777777| 男人吃奶摸下挵进去好爽在线观看| 色噜噜狠狠一区二区三区果冻| 亚洲成a人片在线观看无码关注 | 18黑白丝水手服自慰喷水网站| 13岁幼儿3OOO| 国产精品久久香蕉免费播放| 两女女百合互慰AV赤裸无遮挡| 四虎永久在线精品免费一区二区 | 久久中文字幕AV不卡一区二区| 日韩久久久久久中文人妻| 色综合久久久无码中文字幕波多 | 野花香在线观看免费观看大全动漫 | 三人一起玩弄娇妻高潮| 亚洲综合国产一区二区三区| 国产 在线 | 日韩| 乱人伦人妻中文字幕无码91九| 玩弄中年熟妇正在播放| 18精品久久久无码午夜福利| 国产亚洲精品第一综合| 人妻无码熟妇乱又伦精品视频| 亚洲另类无码专区偷拍| 国产 精品 自在自线| 免费看无码自慰一区二区 | 日韩毛片AV无码免费一区二区三| 亚洲中文字幕乱码电影| 国产精品Ⅴ无码大片在线看| 欧美国产成人久久精品 | 四虎永久在线精品免费无码| 2020久久国产综合精品SWA| 好吊妞人成视频在线观看强行 | 美女张开双腿久久久久久| 亚洲 日本 欧美 中文幕| 成 人 黄 色 网站 69| 国产精品免费久久久久久蜜桃| 免费十大软件大全下载安装| 亚洲AV无码专区里番在线观看| 成 人 黄 色 网 站 视 频| 毛片亚洲AV无码精品国产午夜| 亚洲AV无码成人网站在线观看| 再深点灬舒服灬太大了少妇| 国产亚洲人成在线播放| 日韩精品无码综合福利网| 中文字幕乱理片人妻无码888| 狠狠人妻久久久久久综合蜜桃| 日韩一区在线视频| 99久久精品无码一区二区三区| 公交车上掀开麻麻超短裙| 女人被男人爽到呻吟的视频| 亚洲综合无码一区二区痴汉| 国产亚洲欧美日韩俺去了| 少妇伦子伦精品无码STYLES| JIZZJIZZ中国18大学生| 乱JAPANESE偷窥PISS| 亚洲欧美日韩国产成人| 国产一区二区三区水蜜桃| 四虎影视在线观看2413| 波多野结衣的AV电影| 欧美A级毛欧美1级A大片式放| 一本大道久久东京热无码AV| 好男人 好资源在线 视频| 无码精品人妻AV一区二区三区| 大胸美女污污污WWW网站| 人妻少妇乱子伦精品无码专区毛片 | 亚洲AV中文无码字幕色 | 吧唧吧唧吧唧一口一口吃掉了| 美女扒开尿眼给男人桶爽网站免费 | 18亚洲AV无码成人国产| 久久亚洲色一区二区三区| 亚洲人妻在线视频| 精品国产乱码久久久久软件| 亚洲AV无码成人影院一尤物区| 国产精品青青在线观看爽香蕉 | 欧美一区二区视频在线| 2021国内精品久久久久精品| 美女扒开腿让男人桶爽30分钟 | 久久久久国产一区二区| 亚洲人成精品久久久久| 精品无人区一区二区三区在线| 亚洲成在人线视AV| 狠狠色噜噜狠狠狠狠色综合网| 亚洲AV无码一区二区三区大黄瓜 | 欧美日韩一区二区三区人妻 | 未满十八岁的请自动离开| 国产成人精品无码播放| 他扒开内裤把舌头进去会有影响吗| 高清性色生活片97| 铜铜铜铜铜铜铜铜铜好多水| 国产精品毛片久久久久久久| 午夜男女爽爽羞羞影院在线观看| 国产精品免费久久久久软件| 亚洲A∨国产AV综合AV网站| 国产一二三四区中| 亚洲国产综合无码一区二区BT下 | 人妻免费一区二区三区最新 | 人妻18毛片A级毛片免费看| 爆乳3把你榨干哦OVA在线观看 | 人妻JapanXXXX精品HD| 八戒八戒WWW资源高清| 日韩精品人妻系列无码专区| 岛国岛国免费V片在线观看| 天堂А√中文在线官网| XXXXXHD亚洲日本HD| 人人做人人澡人人爽欧美| 中央气象台1一7天降水量预报图| 免费无码又爽又刺激毛片| AV免费网址在线观看| 久久人妻少妇偷人精品综合桃色 | 一二三四免费观看视频中国| 免费看美女脱精光的网站| 99在线精品免费视频九九视| 日产乱码一二三区别免费影视| 国产成人亚洲精品无码MP4| 亚洲AV成人无码一区在线观看| 久久99国产精品久久| 18级成人毛片免费观看| 日本熟妇人妻中出| 国产精品日日摸夜夜添夜夜添| 亚洲国产成人高清在线观看| 久久亚洲男人第一AV网站| JAVASCRIPT的成熟分类| 天堂AV无码大芭蕉伊人AV孕妇| 国内精品久久久久久久小说| 一本一道AV无码中文字幕| 欧洲精品不卡1卡2卡三卡| 夫妇联欢会回不去的夜晚樱花| 亚洲AV乱码中文一区二区三区| 久久久久成人片免费观看R| JAPANESEMATURE亲| 无码人妻精品一区二区三区9厂 | 中文字幕高清免费日韩视频在线| 人人澡人人透人人爽| 国产偷V国产偷V亚洲高清| 永久免费AV网站| 日韩欧美人妻在线| 激情偷乱人伦小说视频最新章节| 中国少妇内射XXXHD| 色窝窝人妻9色聚色窝| 黑人大荫蒂老太大| 99福利资源久久福利资源| 天天躁日日躁狠狠躁婷婷高清| 久久本道综合久久伊人| でも私はあなたより賢いです意思| 无码人妻熟妇av又大又粗浪潮| 久久久久久人妻无码| 差差差无掩盖视频30分钟| 亚洲AV无码国产永久播放蜜芽| 免费看30分钟打扑克教程| 国产L精品国产亚洲区久久| 亚洲熟妇无码乱子AV| 日本JAPANESE醉酒人妻| 国产又黄又大又粗视频| 2022一本久道久久综合狂躁| 玩弄美艳馊子高潮秀色可贪| 久久婷婷五月综合色国产香蕉| 厨房掀起少妇裙子挺进去| 亚洲一区二区三区AV无码| 久久亚洲AV无码精品色午夜麻| 成人国产亚洲精品A区|