<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java 比較和交換示例 – CAS 算法 > 原文: [https://howtodoinjava.com/java/multi-threading/compare-and-swap-cas-algorithm/](https://howtodoinjava.com/java/multi-threading/compare-and-swap-cas-algorithm/) java 5 中最好的添加之一是`AtomicInteger`,`AtomicLong`等類中支持的原子操作。這些類可幫助您最大程度地減少對復雜(不必要) [**多線程**](//howtodoinjava.com/category/java/multi-threading/ "multi-threading")用于一些基本操作的代碼,例如遞增或遞減在多個線程之間共享的值。 這些類在內部依賴于名為 CAS(比較和交換)的算法。 在本文中,我將詳細討論這個概念。 ## 1.樂觀鎖和悲觀鎖 傳統的鎖定機制,例如,在 Java 中使用`syncronized`關鍵字的**被稱為鎖定或多線程的悲觀技術**。 它要求您首先保證在特定操作之間沒有其他線程會干擾(即鎖定對象),然后僅允許您訪問任何實例/方法。 > 這就像說“請先關上門; 否則,其他騙子會進來重新整理您的東西。” 盡管上述方法是安全的并且確實有效,但是**在性能**上對您的應用造成了重大損失。 原因很簡單,等待線程無法做任何事情,除非它們也有機會執行受保護的操作。 還有一種方法在性能上更有效,并且**本質上是樂觀的**。 通過這種方法,您可以進行更新,**希望可以完成更新而不會受到干擾**。 此方法依靠沖突檢測來確定在更新期間是否存在來自其他方的干擾,在這種情況下,操作將失敗并且可以重試(或不重試)。 > 樂觀的方法就像老話所說:“獲得寬容比得到許可更容易”,這里的“輕松”意味著“更有效率”。 **比較和交換**是這種樂觀方法的一個很好的例子,我們將在下面討論。 ## 2.比較和交換算法 該算法將存儲位置的內容與給定值進行比較,并且只有它們相同時,才會將該存儲位置的內容修改為給定的新值。 這是作為單個原子操作完成的。 原子性保證了根據最新信息計算新值; 如果與此同時值已由另一個線程更新,則寫入將失敗。 操作的結果必須表明它是否執行了替換; 這可以通過簡單的布爾響應(此變量通常稱為“比較設置”)來完成,也可以通過返回從內存位置讀取的值(而不是寫入該值)來完成。 CAS 操作有 3 個參數: 1. 必須替換值的存儲位置`V` 2. 線程上次讀取的舊值`A` 3. 應該寫在`V`上的新值`B` > CAS 說:“我認為`V`應該具有值`A`; 如果可以,則將`B`放在此處,否則不要更改它,但要告訴我我錯了。” CAS 是一種樂觀技術,它希望成功進行更新,并且自從上次檢查變量以來,如果另一個線程更新了該變量,則可以檢測到失敗。 ## 3\. Java 比較和交換示例 讓我們通過一個例子來了解整個過程。 假設`V`是存儲值“10”的存儲位置。 有多個線程想要遞增此值并將遞增的值用于其他操作,這是一種非常實際的方案。 讓我們分步介紹整個 CAS 操作: **1)線程 1 和 2 想要增加它,它們都讀取值并將其增加到 11。** `V = 10,A = 0,B = 0` **2)現在線程 1 首先出現,并將`V`與最后讀取的值進行比較**: `V = 10,A = 10,B = 11` ```java if ?? ?A = V ?? V = B else ?? operation failed ?? return V ``` 顯然,`V`的值將被覆蓋為 11,即操作成功。 **3)線程 2 到來并嘗試與線程 1 相同的操作** `V = 11,A = 10,B = 11` ```java if ?? ?A = V ?? V = B else ?? operation failed ?? return V ``` **4)在這種情況下,`V`不等于`A`,因此不替換值,并且返回`V`即 11 的當前值。 現在線程 2,再次使用以下值重試此操作**: `V = 11,A = 11,B = 12` 而這一次,條件得到滿足,增量值 12 返回線程 2。 總而言之,當多個線程嘗試使用 CAS 同時更新同一變量時,一個將獲勝并更新該變量的值,而其余則將丟失。 但是失敗者并不會因為線程中斷而受到懲罰。 他們可以自由地重試該操作,或者什么也不做。 這就是與 Java 支持的原子操作有關的這個簡單但重要的概念的全部。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看