<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          樂觀鎖 VS 悲觀鎖

          共 1525字,需瀏覽 4分鐘

           ·

          2021-05-14 12:26

          點擊上方藍色字體,選擇“標星公眾號”

          優(yōu)質文章,第一時間送達

          樂觀鎖 VS 悲觀鎖

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

          樂觀鎖:總是認為不會產生并發(fā)問題,每次去取數(shù)據(jù)的時候總認為不會有其他線程對數(shù)據(jù)進行修改,因此不會上鎖,但是在更新時會判斷其他線程在這之前有沒有對數(shù)據(jù)進行修改。
          樂觀鎖在Java中通過使用無鎖來實現(xiàn),常用的是CAS,Java中原子類的遞增就是通過CAS自旋實現(xiàn)。

          CAS

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

          一個 CAS 涉及到以下操作:
          我們假設內存中的原數(shù)據(jù)V,舊的預期值A,需要修改的新值B,

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

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

          3. 返回操作是否成功。

          CAS的底層原理

          • 調用 Unsafe 類中的 CAS 方法,JVM 會幫我們實現(xiàn)出 CAS 匯編指令

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

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

          CAS的三大問題

          • 如果 CAS 長時間一直不成功,會給 CPU 帶來很大的開銷,在Java的實現(xiàn)中是一只通過while循環(huán)自旋CAS獲取鎖。

          • 只能保證一個共享變量的原子操作

          • 引出了 ABA 問題

          ABA問題

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

          如何解決ABA問題
          加入版本信息,例如攜帶 AtomicStampedReference 之類的時間戳作為版本信息,保證不會出現(xiàn)老的值。

          UnSafe

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

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

          Unsafe可認為是Java中留下的后門,提供了一些低層次操作,如直接內存訪問、線程調度等。

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




          版權聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權協(xié)議,轉載請附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/qq_44346427/article/details/116405930







          粉絲福利:Java從入門到入土學習路線圖

          ??????

          ??長按上方微信二維碼 2 秒


          感謝點贊支持下哈 

          瀏覽 47
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  午夜精品一区二区三区视频免费看 | 黄色毛片在线观看 | 西西西444www无码视 | 日日夜夜精品视频免费 | 久青草在在线 |