1. 程式人生 > 程式設計 >多執行緒-java 比較然後設定compareAndSet

多執行緒-java 比較然後設定compareAndSet

核心類

是Unsafe

核心方法

compareAndSet(舊值,新值);

如何應用?

1.Unsafe.compareAndSet(舊值,新值);
2.自己實現工具類 //必須包含一個資料,這個資料就是舊值

最核心的東西,就是上面兩個東西。

程式碼

自定義工具類{
    private Unsafe unsafe; //提供比較然後設定方法的功能
    private volatile int oldValue; //儲存舊值
}
複製程式碼

具體步驟

1.讀取舊值  //自定義工具類.oldValue;  
2.比較然後設定  //Unsafe.compareAndSet(舊值,新值);   
3.true,就設定新的值;false
,就不設定 //Unsafe.compareAndSet(舊值,新值); 的返回結果 複製程式碼

應用場景

1.原子計數器AtomicInteger
2.顯式鎖AbstractQueuedSynchronizer

他們的實現,都是跟我們的自定義工具類是一樣的原理,就是核心兩步

1.private Unsafe unsafe; //提供比較然後設定方法的功能
2.private volatile int oldValue; //儲存舊值
複製程式碼

比較,到底是在比較什麼?到底是如何比較?

比較的到底又是哪些值?

本質是

1.自定義實現類.get舊值(); //這裡的舊值,就是自定義類的資料
2.Unsafe.compareAndSet(舊值,新值); //這裡的舊值,就是第一步讀的資料
複製程式碼

舊值分別是哪個,弄清楚了。現在的問題是,Unsafe.compareAndSet(舊值,新值);裡的舊值,到底是在和誰比較?還是和自定義實現類的資料進行比較。

因為第一步,和第二步,是兩個操作,所以這兩個操作不是原子的,因此,Unsafe.compareAndSet(舊值,新值); 的返回值才會有true或false兩種情況。

真正原子的地方,是Unsafe.compareAndSet(舊值,新值);這個方法本身。即包含了1.比較校驗資料2.設定新的資料,這兩步操作。

最佳實踐

一般都是直接使用jdk提供的工具類,工具類的本質是封裝了1.Unsafe //用於比較設定 2.資料 //用於同步。

除非jdk不能滿足需求,才會自己去實現工具類。

本質

比較設定,本質是為瞭解決執行緒安全問題,

工具類

作用就是同步工具類。本質也是為瞭解決執行緒安全問題。

不管是誰實現的,你自己實現的,還是jdk實現的,作用和要解決的問題是一樣的。