樂(lè)觀鎖 VS 悲觀

      網(wǎng)友投稿 639 2025-04-04

      悲觀鎖:總是假設(shè)最壞的情況,每次取數(shù)據(jù)時(shí)都認(rèn)為其他線程會(huì)修改,所以都會(huì)加鎖(讀鎖、寫鎖、行鎖等),當(dāng)其他線程想要訪問(wèn)數(shù)據(jù)時(shí),都需要阻塞掛起。


      樂(lè)觀鎖:總是認(rèn)為不會(huì)產(chǎn)生并發(fā)問(wèn)題,每次去取數(shù)據(jù)的時(shí)候總認(rèn)為不會(huì)有其他線程對(duì)數(shù)據(jù)進(jìn)行修改,因此不會(huì)上鎖,但是在更新時(shí)會(huì)判斷其他線程在這之前有沒(méi)有對(duì)數(shù)據(jù)進(jìn)行修改。

      樂(lè)觀鎖在Java中通過(guò)使用無(wú)鎖來(lái)實(shí)現(xiàn),常用的是CAS,Java中原子類的遞增就是通過(guò)CAS自旋實(shí)現(xiàn)。

      CAS

      樂(lè)觀鎖 VS 悲觀鎖

      CAS全稱 Compare And Swap(比較與交換),是一種無(wú)鎖算法。在不使用鎖(沒(méi)有線程被阻塞)的情況下實(shí)現(xiàn)多線程之間的變量同步。java.util.concurrent包中的原子類就是通過(guò)CAS來(lái)實(shí)現(xiàn)了樂(lè)觀鎖。

      一個(gè) CAS 涉及到以下操作:

      我們假設(shè)內(nèi)存中的原數(shù)據(jù)V,舊的預(yù)期值A(chǔ),需要修改的新值B,

      1、比較 A 與 V 是否相等。(比較)

      2、如果比較相等,將 B 寫入 V。(交換)

      3、返回操作是否成功。

      CAS的底層原理

      1、調(diào)用 Unsafe 類中的 CAS 方法,JVM 會(huì)幫我們實(shí)現(xiàn)出 CAS 匯編指令

      2、這是一種完全依賴于硬件的功能,通過(guò)它實(shí)現(xiàn)原子操作

      3、原語(yǔ)的執(zhí)行必須是連續(xù)的,在執(zhí)行過(guò)程中不允許被中斷,CAS 是 CUP 的一條原子指令

      CAS的三大問(wèn)題

      1、如果 CAS 長(zhǎng)時(shí)間一直不成功,會(huì)給 CPU 帶來(lái)很大的開(kāi)銷,在Java的實(shí)現(xiàn)中是一只通過(guò)while循環(huán)自旋CAS獲取鎖。

      2、只能保證一個(gè)共享變量的原子操作

      3、引出了 ABA 問(wèn)題

      ABA問(wèn)題

      CAS需要在操作值的時(shí)候檢查內(nèi)存值是否發(fā)生變化,沒(méi)有發(fā)生變化才會(huì)更新內(nèi)存值。但是如果內(nèi)存值原來(lái)是A,后來(lái)變成了B,然后又變成了A,那么CAS進(jìn)行檢查時(shí)會(huì)發(fā)現(xiàn)值沒(méi)有發(fā)生變化,但是實(shí)際上是有變化的。

      如何解決ABA問(wèn)題

      加入版本信息,例如攜帶 AtomicStampedReference 之類的時(shí)間戳作為版本信息,保證不會(huì)出現(xiàn)老的值。

      UnSafe

      Unsafe類是在sun.misc包下,不屬于Java標(biāo)準(zhǔn)。但是很多Java的基礎(chǔ)類庫(kù),包括一些被廣泛使用的高性能開(kāi)發(fā)庫(kù)都是基于Unsafe類開(kāi)發(fā)的,比如Netty、Cassandra、Hadoop、Kafka等。Unsafe類在提升Java運(yùn)行效率,增強(qiáng)Java語(yǔ)言底層操作能力方面起了很大的作用。

      使用Unsafe可用來(lái)直接訪問(wèn)系統(tǒng)內(nèi)存資源并進(jìn)行自主管理,Unsafe類在提升Java運(yùn)行效率,增強(qiáng)Java語(yǔ)言底層操作能力方面起了很大的作用。

      Unsafe可認(rèn)為是Java中留下的后門,提供了一些低層次操作,如直接內(nèi)存訪問(wèn)、線程調(diào)度等。

      這個(gè)類的提供了一些繞開(kāi)JVM的更底層功能,基于它的實(shí)現(xiàn)可以提高效率。但是,它是一把雙刃劍:正如它的名字所預(yù)示的那樣,它是Unsafe的,它所分配的內(nèi)存需要手動(dòng)free(不被GC回收)。如果對(duì)Unsafe類理解的不夠透徹,就進(jìn)行使用的話,就等于給自己挖了無(wú)形之坑,最為致命。

      Java 數(shù)據(jù)庫(kù)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:睡前來(lái)一個(gè)— "螞蟻呀嘿",快用 ModelArts 自己也實(shí)現(xiàn)一個(gè)+1
      下一篇:批注為什么不自動(dòng)顯示了,之前是每次鼠標(biāo)經(jīng)過(guò)就會(huì)顯示的,現(xiàn)在沒(méi)有了,很不方便!!怎么處理?
      相關(guān)文章
      亚洲色成人WWW永久在线观看| 激情97综合亚洲色婷婷五| 亚洲一区二区三区乱码A| 亚洲乱亚洲乱妇24p| 亚洲一级免费视频| 久久久亚洲AV波多野结衣| 亚洲国产成人久久综合碰碰动漫3d | 亚洲国产精品久久66| 亚洲日韩欧洲无码av夜夜摸| 亚洲成AV人在线观看网址| 亚洲精品偷拍视频免费观看 | 亚洲AV无码成人精品区大在线| 麻豆亚洲AV成人无码久久精品| 亚洲av综合av一区二区三区 | 亚洲熟妇AV一区二区三区宅男| 亚洲性色精品一区二区在线| 亚洲精品无码专区| 日韩色视频一区二区三区亚洲 | 91亚洲va在线天线va天堂va国产 | 亚洲福利一区二区| 亚洲人成免费电影| 亚洲精品中文字幕无乱码麻豆| 亚洲国产成人99精品激情在线| 久久亚洲精品国产精品婷婷| 亚洲youwu永久无码精品| 爱情岛论坛亚洲品质自拍视频网站| 亚洲成a人无码亚洲成www牛牛 | 亚洲国产精品久久久久| 亚洲成av人片不卡无码| 亚洲精品综合在线影院| 国产亚洲欧美日韩亚洲中文色 | 色噜噜综合亚洲av中文无码| 久久综合亚洲色一区二区三区| 亚洲精品美女久久久久| 亚洲校园春色另类激情| 亚洲avav天堂av在线网毛片| 亚洲av无码不卡私人影院| 国产亚洲美女精品久久久2020| 亚洲AV无码专区国产乱码4SE| 亚洲自偷自拍另类图片二区| 亚洲国产精品免费观看 |