?? ???? ??? ?????
??? ???? ?? ?? ???? ???????.
?? ??? ?? ??? ?? ?, ?? ? ?? ????? ?? ???? ???? ?? ??? ? ????. ??? ??? ??? ??? ? ? ??? ????. ???(劉孫)? ???? ??? ?? ??? ??? ???? ???? ?? ??? ??(郡堂) ??(郭淮)? ??? ?? ??(吉師)? ??? ?? ??? ???. ?? ? ????? ?????, ???? ?????? ?? ??? ?? ??? ??? ?? ?? ??? ??? ?????. ???? ?? ???? ??? ??? ???? ????. ??? ?? ??? ?? ??? ?? ???? ?????. ??? ??? ????? ?? ????? ???. ?? ??? ??. ??? ??? ??? ??? ?????? ?? ???? ??? ???? ???? ??? ??? ??? ?????. ? ???? ??? ?? ??? ???, ???? ??? ???????. ???? 6? ?, ???? ??? ??? ??????. Zhenzong? ? ?? ???? ??? ??? ? Baxianwang (???? ??? ?? ? ??)? ??? ??? ???? ???? ?????.
? ???? ?? ??? ???? ? ?????? ?????, ??? ??? ???? ?? ??? ??? ?? ?? ????? ?? ? ? ????. ??? ??? ? ??? ????? ??, ??? ?? ??? ??? ???? ??.
? ???? ?? ??? ?????? ?? ?? ??? ???? ?? ??? ????. ?? ??? ??? ??? ??? ????? ??? ??? ???? ? ? ????? ??? ???? ?????? ??? ? ??? ???? ???? ???.
ABA ?? ??
?? ??? ????CAS
會出現(xiàn)ABA
???? ABA ??? ?? ??? ??? ??? ????. ?? ?? ??? ?? ?? CAS ??? ???? ? ?? ???? ????. A) ??? ? ? ?? ???? ??? ????.
??? 1, ?? ?? A, ????? ?? B ??? 2, ?? ?? A, ????? ?? B
??? 1? CPU ?? ????? ?????. ?? ??? 2? ?? ??? CPU ?? ????? ?? ???? ?? ??? 1? ?? A? ?? ?? ???? ??? ??? ??? ?? ?? B? ???????. ??, ??? 3? ????, ???? B, ????? ?? A??, ??? 3? ?? ???? ?????. B?? ???? ??? ???????. ?? ??? 2? ????? ???? CPU ?? ????? ?????. ?? ??? 2? ?? ?? ? A? ???? ??? ??? ???? ?? ???????. B.?? ??? 2? ??? ????? ??? 2? ?? A->B->A? ?? ??? ???? ??? ?? ????.
???? ?? ?????
???? ??????? 50??? ????? ????? ??? ?? 2? ???? ??? ??? 100?? 50?? ??????. ??:
-
??? 1(?? ???): ?? ? 100? ???? 50?? ????? ??? ?????. ??? 2(?? ???): ?? ? 100? ???? 50?? ????? ??? ?????. ??? 1? ????? ?????? ??? 2? ?? ??? ???????. - ? ? ??? Xiao Ming?? 50? ?????.
- ??? 3(???): ?? ? 50? ???? ?? ?????. ?? ??? 3? ????? ???? ??? 100? ???.
- ??? 2? ???? ???? 100? ????. ?? ? ???? ??? 50?? ???????.
- ?? ???
100(100-50+50)
,但是實際上變?yōu)榱?code style='font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);'>50(100-50+50-50)
ABA ??? ????? ??? ?? V? ?? ??? ??? ?? ??? 1? ?????.
?? ??
AtomicStampedReference? ?? ABA ?? ??
AtomicStampedReference? ????? ?? ?? ?? ??? ?? ?????. ???? ???? ?? ?? ??
AtomicStampedReference? ?? ?? ??? ? ??? ????? ?? ?? ?? ???? ?? ?? ?? ???? ???.
private static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<Integer>(100,1); public static void main(String[] args) { //第一個線程 new Thread(() -> { System.out.println("t1拿到的初始版本號:" + atomicStampedReference.getStamp()); //睡眠1秒,是為了讓t2線程也拿到同樣的初始版本號 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } atomicStampedReference.compareAndSet(100, 101,atomicStampedReference.getStamp(),atomicStampedReference.getStamp()+1); atomicStampedReference.compareAndSet(101, 100,atomicStampedReference.getStamp(),atomicStampedReference.getStamp()+1); },"t1").start(); // 第二個線程 new Thread(() -> { int stamp = atomicStampedReference.getStamp(); System.out.println("t2拿到的初始版本號:" + stamp); //睡眠3秒,是為了讓t1線程完成ABA操作 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("最新版本號:" + atomicStampedReference.getStamp()); System.out.println(atomicStampedReference.compareAndSet(100, 2019,stamp,atomicStampedReference.getStamp() + 1) + "\t當前值:" + atomicStampedReference.getReference()); },"t2").start(); }
1. ?? ? 100, ?? ?? ?? 1
2. ??? t1? t2? ??? ?? ?? ??? ????
3. ??? t1? ABA ??? ???? ?? ??? 3?? ?????. .Thread t2 CAS ??? ???????. ??? ??? t2?? ?? ?? ?? 1? ???? ????.
?? ??:
t1拿到的初始版本號:1 t2拿到的初始版本號:1 最新版本號:3 false 當前值:100
AtomicMarkableReference
? ?? ABA ??? ?????. AtomicMarkableReference? ??? ???? ??? ???? ?? ? ?? int? ???? ?? ?? ??? ?????? ??? ???? ?? ?? ??? ????? ????.
private static AtomicMarkableReference<Integer> atomicMarkableReference = new AtomicMarkableReference<Integer>(100,false); public static void main(String[] args) { // 第一個線程 new Thread(() -> { System.out.println("t1版本號是否被更改:" + atomicMarkableReference.isMarked()); //睡眠1秒,是為了讓t2線程也拿到同樣的初始版本號 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } atomicMarkableReference.compareAndSet(100, 101,atomicMarkableReference.isMarked(),true); atomicMarkableReference.compareAndSet(101, 100,atomicMarkableReference.isMarked(),true); },"t1").start(); // 第二個線程 new Thread(() -> { boolean isMarked = atomicMarkableReference.isMarked(); System.out.println("t2版本號是否被更改:" + isMarked); //睡眠3秒,是為了讓t1線程完成ABA操作 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("是否更改過:" + atomicMarkableReference.isMarked()); System.out.println(atomicMarkableReference.compareAndSet(100, 2019,isMarked,true) + "\t當前值:" + atomicMarkableReference.getReference()); },"t2").start(); }
AtomicStampedReference
可以給引用加上版本號,追蹤引用的整個變化過程,如:A -> B -> C -> D -> A,通過AtomicStampedReference,我們可以知道,引用變量中途被更改了3次。但是,有時候,我們并不關(guān)心引用變量更改了幾次,只是單純的關(guān)心是否更改過,所以就有了AtomicMarkableReference
1. ?? ?? 100?? ?? ?? ??? ???? ?????. false 2. ??? t1? t2? ??? ?? ?? ??? ??? ???? ?????. false?? ??. :3. , ?? ??? ???????.
4. ??? t2? CAS ??? ??????. ?? ??? ??? ??? t2?? ?? ?? ?? false? ???? ????.
以上是本期關(guān)于CAS領(lǐng)域的一個經(jīng)典ABA問題的解析,不知道你在實際的工作中有沒有遇到過,但是在面試中這塊是并發(fā)知識考查的重點。如果你還沒接觸過此類的問題,我的建議是你自己將上面的代碼運行一下,結(jié)合理論去理解一下ABA問題所帶來的問題以及如何解決他,這對你日后的開發(fā)工作也是有莫大的幫助的! ? ??? ???? ?????. ABA ??? ???? ?????? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!t1版本號是否被更改:false
t2版本號是否被更改:false
是否更改過:true
false 當前值:100
多說幾句

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

CAS(CentralAuthenticationService)? ?? PHP ?? ?? ???? ??? ??? ?? ??? ?? ?? ? ?? ??? ?? ????? ????. ? ??????? ??? ? ??? ???? ???? ?? ???? ???? ?? ?????. ? ??? ???? ?? PHP ?? ??? ?? CAS(CentralAuthenticationService)? ??? ? ????. ??

1. ?? ???? ??? ???? ?? CAS ??? ???? ??? ???? ????? ?? ???? ???? ??? ?? ???? ??? ????? ??? ?? ??? ?????. CAS? ??? ??? ???? ? ? ????. 2. AtomInteger ??? ???? sum.misc.Unsafe? ????? ???? ?? ??? ? ????. Unsafe?? ??? ???. ?? Java ??? ? ??? ??? ??? ??? ???? ???? ?? ??????. ??? ?? Unsafe? Java? ?? ??? ?? ?????. publicfinalnativebooleancompareAndSwapInt(Object

CAS ??: CAS(?? ? ??), ?? ? ????. ?? ??? ?? ???? ?? ???? ?? ???? ?? ??? ??? ? ?? ???????. CAS ???? ??? ??(V), ?? ?? ?(A), ? ?(B)? ? ?? ????? ?????. ??? ??? ?? ???? ?? ?? ???? ????? ???? ?? ?? ? ??? ???????. ??? ??? ????? ?? ??? ???? ????. ???? ? ????? num ?? ???? num?? ?????. ?? ? ? ???? ?? ? ?? num ?? ? ???? num ?? ?????. ??? ?? num???. ? ???? ???? ??? ??? ??? ??? ?????. CAS?? ??

CASCAS? CompareAndSwap, ? ???? ???? ????. CAS? ??? ???? ??? ?? ???? ??? ??? ??? ???? ??? ?????? ??? ??? CAS? ??? ?? ????? ?????. ???? ???? ???? ????? ??? ????. CAS? ???? ???? ??? ? ???? ?? ?? ??? ????. ??? ??? ?? ???? ???? ?? ?? ?? ?? ??? ?? ?? ???? ?????. ????? ?? ??? ?? ???? ?? ???? ???? ?????. ?? ?? ?? ?? ???? ???. ?? ?? ?? ?? ?? ?? ???? ?? ??? ?? ???? ?? ?????? ?????. ? CAS ??? ??? ????? ? ? ????. ??? ??? ??? ?????, ??? ???? ??? ????.

?? ??? ???? ?????(?? ?? ????? ? ? ? ??)?? ?? ?????? ?? ??? ??? ??(Mutex)? ???? ?? ?? ?????. ?? ?? ???? ???? ??? ??? ?? ?? ??? ??? ?? ??? ??? ?? std::sync::Mutex? ???? ????. (?? ???? ??? ???? ?? ? ??? Arc? ???????.) usetd::sync::{Mutex,Arc};#[derive(Clone)]structConcurrentStack{inner:Arc,}implConcurrentStack{pubfnnew()-> Self{

??????? 100?? ???? ????, ? ???? ???? inc? 10,000?? ??? ??????. ????? ????? inc? ?? ?? 1,000,000? ??? ???, ???????? ????? ?? ???? ??? ?? ????. ?, ?? ?? ???? ??? ? ????? ??? ?? ?? ? ????.

?? ??? CAS ??? ???? ABA ??? ?? ?????. ?? ???? ?? ????? ?????, ????? ??? ?? ???? ??? ?????. ?? ??? ??? ???? ???? ?? ??? ?? ??? ?? ?? ????.

1. ? springboot ????? ???? ??? org.jasig.cas.clientcas-client-support-springboot3.6.22? ?????. @EnableCasClient ?? packagecom.codetiler.demo;importorg.jasig.cas.client.boot.configuration? ?????. EnableCasClient;importorg.springframework.boot.SpringApplication;importorg.spring
