<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 基本數據類型原子類 * AtomicBoolen: boolean類型原子類 * AtomicInteger: int類型原子類 * AtomicLong: long類型原子類 常用方法(以AtomicInteger為例) * addAndGet(int delta) :以原子方式將輸入的數值與實例中原本的值相加,并返回最后的結果; * incrementAndGet() :以原子的方式將實例中的原值進行加1操作,并返回最終相加后的結果; * getAndSet(int newValue):將實例中的值更新為新值,并返回舊值; * getAndIncrement():以原子的方式將實例中的原值加1,返回的是自增前的舊值; ## 數組類型原子類 * AtomicIntegerArray:Int數組類型原子類 * AtomicLongArray:long數組類型原子類 * AtomicReferenceArray:引用類型原子類(關于AtomicReferenceArray即引用類型原子類會在下文介紹) AtomicIntegerArray為例 ~~~ class AtomicDemo { private int[] value = new int[]{0, 1, 2}; private AtomicIntegerArray mAtomicIntegerArray = new AtomicIntegerArray(value); private void doAdd() { for (int i = 0; i < 5; i++) { int value = mAtomicIntegerArray.addAndGet(0, 1); System.out.println(Thread.currentThread().getName() + "--->" + value); } } public static void main(String[] args) { AtomicDemo demo = new AtomicDemo(); new Thread(demo::doAdd, "線程1").start(); new Thread(demo::doAdd, "線程2").start(); } } /程序輸出結果如下: 線程1--->1 線程1--->2 線程1--->4 線程2--->3 線程1--->5 線程2--->6 線程1--->7 線程2--->8 線程2--->9 線程2--- ~~~ ## 引用類型原子類 在Java并發編程之Java CAS操作文章中我們曾經提到過兩個問題 * 第一個問題:雖然我們能通過循環CAS操作來完成對一個變量的原子操作,但是對于多個變量進行操作時,自旋CAS操作就不能保證其原子性。 * 第二個問題:ABA問題,因為CAS在操作值的時候,需要檢查值有沒有發生變化,如果沒有發生變化則更新,但是如果一個值原來是A,變成了B,又變成了A,那么使用CAS進行檢查時會發現她的值并沒有發生變化。那么會導致程序出問題。 為了解決上述提到的兩個問題,Java為我們提供了AtomicReference等系列引用類型原子類,來保證引用對象之間的原子性,即可以把多個變量放在一個對象里來進行CAS操作與ABA問題。主要類型原子類如下: * AtomicReference: * AtomicReferenceFieldUpdater: * AtomicMarkableReference: * AtomicStampedReference: ABA問題帶來的隱患,各種樂觀鎖的實現中通常都會用版本戳version來對記錄或對象標記,避免并發操作帶來的問題,在Java中,AtomicStampedReference也實現了這個作用,它通過包裝\[E,Integer\]的元組來對對象標記版本戳stamp,從而避免ABA問題, ## 參考資料 [Java并發編程:原子類Atomic](https://blog.csdn.net/fei20121106/article/details/83268122)
                  <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>

                              哎呀哎呀视频在线观看