使用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 }