使用AtomicStampedReference<T>的大坑
- 2020 年 3 月 14 日
- 筆記
//在初始化的時候會把引用和時間戳存到pair中
AtomicStampedReference<Integer> integerAtomicStampedReference = new AtomicStampedReference<Integer>(2020,1);
然後執行
System.out.println(integerAtomicStampedReference.compareAndSet(2020,2021,integerAtomicStampedReference.getStamp(),integerAtomicStampedReference.getStamp()+1));
//此時的2020和Pair中的2021不是同一個對象了
//這裡注意Integer是一個類 在-127——+128有快取
//大於128沒有快取,所以
//compareAndSet中expectedReference和current的地址就不同了我草,結果執行下邊就返回false了
1 public boolean compareAndSet(V expectedReference, 2 3 V newReference, 4 5 int expectedStamp, 6 7 int newStamp) { 8 9 Pair<V> current = pair; 10 11 return 12 13 expectedReference == current.reference &&//這一行就是false 14 15 expectedStamp == current.stamp && 16 17 ((newReference == current.reference && 18 19 newStamp == current.stamp) || 20 21 casPair(current, Pair.of(newReference, newStamp))); 22 23 }