AtomicReference實例使用Unsafe CAS操作來利用處理器指令進行鎖定。但我有點困惑,它在複雜對象的情況下如何工作。AtomicReference如何使用CAS來處理複雜對象
例如讓我們假設我有一個Person類(id,firstName,lastName)的實例。我正在將對象實例共享給多個線程t1,t2和t3。由於操作應該是原子的,所以不要共享Person類對象實例,我會將該對象包裝到AtomicReference實例中並與所有線程共享。
現在線程t1只更新firstName,線程t2只更新lastName而線程t3更新firstName和lastName。之後,每個線程都會調用compareAndSet方法來反映新的更改。
此外,我正在使用易失性參考,以便寫入可以發生在主內存和所有線程都可見。
我想明白了:
在上述情況下,當compareAndSet被調用,有什麼期望之間將被比較的東西和新的價值Person類的實例(如ID,名字,姓氏)?
假設線程t1已更新firstName並調用compareAndSet。線程t2已經更新了lastName,並且只是要調用compareAndSet。在這種情況下,AtomicReference如何保證線程t2不會擦除線程t1所做的更改,即更新firstName?
假設2個線程t1和t2同時調用了compareAndSet那麼誰將贏得比賽以及其他線程誰會失敗呢?