1、循环时间长开销很大
2、ABA问题
版本号时间戳原子引用
AtomicStampedReference带戳记流水的简单演示(单线程)
@Data
@AllArgsConstructor
@NoArgsConstructor
class Book {
private int id;
private String bookName;
}
public class AtomicStampedReferenceDemo {
public static void main(String[] args) {
Book javaBook = new Book(1, "javaBook");
AtomicStampedReference<Book> atomicStampedReference = new AtomicStampedReference<>(javaBook, 1);
System.out.println(atomicStampedReference.getReference() + "\t" + atomicStampedReference.getStamp());
Book mysqlBook = new Book(2, "mysqlBook");
boolean b;
b = atomicStampedReference.compareAndSet(javaBook, mysqlBook, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1);
System.out.println(b + "\t" + atomicStampedReference.getReference() + "\t" + atomicStampedReference.getStamp());
b = atomicStampedReference.compareAndSet(mysqlBook, javaBook, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1);
System.out.println(b + "\t" + atomicStampedReference.getReference() + "\t" + atomicStampedReference.getStamp());
}
}
/**
* Book(id=1, bookName=javaBook) 1
* true Book(id=2, bookName=mysqlBook) 2
* true Book(id=1, bookName=javaBook) 3
*/