多執行緒-java 比較然後設定compareAndSet
阿新 • • 發佈:2020-06-24
核心類
是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實現的,作用和要解決的問題是一樣的。