<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【轉(zhuǎn)】-Java CAS操作的ABA問(wèn)題

      Java CAS操作的ABA問(wèn)題

      本文轉(zhuǎn)載至?ksfzhaohui??Java CAS操作的ABA問(wèn)題

      1. CAS介紹

      比較并交換(compare and swap, CAS),是原子操作的一種,可用于在多線程編程中實(shí)現(xiàn)不被打斷的數(shù)據(jù)交換操作,從而避免多線程同時(shí)改寫(xiě)某一數(shù)據(jù)時(shí)由于執(zhí)行順序不確定性以及中斷的不可預(yù)知性產(chǎn)生的數(shù)據(jù)不一致問(wèn)題。

      CAS操作基于CPU提供的原子操作指令實(shí)現(xiàn),各個(gè)編譯器根據(jù)這個(gè)特點(diǎn)實(shí)現(xiàn)了各自的原子操作函數(shù)。來(lái)源維基百科:

      C語(yǔ)言:由GNU提供了對(duì)應(yīng)的__sync系列函數(shù)完成原子操作。
      Windows:通過(guò)WindowsAPI實(shí)現(xiàn)了InterLocked Functions
      C++ 11:STL提供了atomic系列函數(shù)。
      JAVA:sun.misc.Unsafe提供了compareAndSwap系列函數(shù)。
      C#:通過(guò)Interlocked方法實(shí)現(xiàn)。
      Go:通過(guò)import "sync/atomic"包實(shí)現(xiàn)。

      java.util.concurrent包完全建立在CAS之上的,借助CAS實(shí)現(xiàn)了區(qū)別于synchronouse同步鎖的一種樂(lè)觀鎖。
      可以看一下AtomicInteger

      public final int getAndIncrement() {
           for (;;) {
               int current = get();
               int next = current + 1;
               if (compareAndSet(current, next))
                   return current;
           }
      }
      
      public final boolean compareAndSet(int expect, int update) {
           return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
      }
      

      其中牽扯到3個(gè)值:currentnext以及當(dāng)前內(nèi)存中的最新值,當(dāng)且僅當(dāng)current和內(nèi)存中的最新值相同時(shí),才會(huì)改變內(nèi)存值為next。

      2. CAS的ABA問(wèn)題

      ABA問(wèn)題描述:

      1. 進(jìn)程P1在共享變量中讀到值為A
      2. P1被搶占了,進(jìn)程P2執(zhí)行
      3. P2把共享變量里的值從A改成了B,再改回到A,此時(shí)被P1搶占。
      4. P1回來(lái)看到共享變量里的值沒(méi)有被改變,于是繼續(xù)執(zhí)行。

      雖然P1以為變量值沒(méi)有改變,繼續(xù)執(zhí)行了,但是這個(gè)會(huì)引發(fā)一些潛在的問(wèn)題。ABA問(wèn)題最容易發(fā)生在lock free的算法中的,CAS首當(dāng)其沖,因?yàn)镃AS判斷的是指針的地址。如果這個(gè)地址被重用了呢,問(wèn)題就很大了。(地址被重用是很經(jīng)常發(fā)生的,一個(gè)內(nèi)存分配后釋放了,再分配,很有可能還是原來(lái)的地址)。

      ABA問(wèn)題解決方案
      各種樂(lè)觀鎖的實(shí)現(xiàn)中通常都會(huì)用版本戳version?來(lái)對(duì)記錄或?qū)ο髽?biāo)記,避免并發(fā)操作帶來(lái)的問(wèn)題,在Java中,?AtomicStampedReference?也實(shí)現(xiàn)了這個(gè)作用,它通過(guò)包裝類?Pair[E,Integer]的元組來(lái)對(duì)對(duì)象標(biāo)記版本戳stamp,從而避免ABA問(wèn)題。

      下面看一下AtomicIntegerAtomicStampedReference分別執(zhí)行CAS操作:

      import java.util.concurrent.atomic.AtomicInteger;
      import java.util.concurrent.atomic.AtomicStampedReference;
      
      public class ABASingle {
      
          public static void main(String[] args) {
              AtomicInteger atomicInt = new AtomicInteger(100);
              atomicInt.compareAndSet(100, 101);
              atomicInt.compareAndSet(101, 100);
              System.out.println("new value = " + atomicInt.get());
              boolean result1 = atomicInt.compareAndSet(100, 101);
              System.out.println(result1); // result:true
      
              AtomicInteger v1 = new AtomicInteger(100);
              AtomicInteger v2 = new AtomicInteger(101);
              AtomicStampedReference<AtomicInteger> stampedRef = new AtomicStampedReference<AtomicInteger>(
                      v1, 0);
      
              int stamp = stampedRef.getStamp();
              stampedRef.compareAndSet(v1, v2, stampedRef.getStamp(),
                      stampedRef.getStamp() + 1);
              stampedRef.compareAndSet(v2, v1, stampedRef.getStamp(),
                      stampedRef.getStamp() + 1);
              System.out.println("new value = " + stampedRef.getReference());
              boolean result2 = stampedRef.compareAndSet(v1, v2, stamp, stamp + 1);
              System.out.println(result2); // result:false
          }
      }
      

      AtomicInteger 執(zhí)行cas操作成功,AtomicStampedReference執(zhí)行cas操作失敗。

      這樣是不是就是說(shuō)AtomicInteger存在ABA問(wèn)題,根本就不能用了;肯定是可以用的,AtomicInteger處理的一個(gè)數(shù)值,所有就算出現(xiàn)ABA問(wèn)題問(wèn)題,也不會(huì)有什么影響;但是如果這里是一個(gè)地址 (地址被重用是很經(jīng)常發(fā)生的,一個(gè)內(nèi)存分配后釋放了,再分配,很有可能還是原來(lái)的地址) ,比較地址發(fā)現(xiàn)沒(méi)有問(wèn)題,但其實(shí)這個(gè)對(duì)象早就變了,這時(shí)候就可以使用AtomicStampedReference來(lái)解決ABA問(wèn)題。

      posted @ 2024-07-10 09:32  booleandev  閱讀(20)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲精品综合一区二区三区在线| 免费国产拍久久受拍久久| 亚洲色偷偷色噜噜狠狠99| 乱码精品一区二区三区| 福利一区二区1000| 国产熟女一区二区三区四区| 亚洲精品毛片一区二区| av区无码字幕中文色| 亚洲国产免费图区在线视频| 性欧美牲交在线视频| 久久99国产精品尤物| 久久―日本道色综合久久| 欧美videosdesexo吹潮| 日韩中文字幕v亚洲中文字幕| 蜜臀av无码一区二区三区| 亚洲第一成人网站| 欧美国产亚洲日韩在线二区| 无码人妻斩一区二区三区| 久久午夜无码鲁丝片直播午夜精品| 中文字幕免费不卡二区| 加勒比无码人妻东京热| 韩国午夜福利片在线观看| 91中文字幕一区在线| 天堂а√8在线最新版在线| 亚洲AV日韩AV综合在线观看| 亚洲人成电影网站 久久影视| 亚洲色最新高清AV网站| 国产精品午夜精品福利| 亚洲综合成人av在线| 成人免费无遮挡在线播放| 日韩精品国内国产一区二| 日韩女同一区二区三区久久| 亚洲国产欧美在线人成| 亚洲免费最大黄页网站| 国色天香中文字幕在线视频| 亚洲精品日韩中文字幕| 国产普通话对白刺激| 久久综合五月丁香六月丁香| 亚洲国产成人av毛片大全| 中文字幕无码不卡在线| 亚洲欧美综合一区二区三区|