AtomicMarkableReference

AtomicStampedReference的简化版,只关注有没有被更改过。
原子更新带有标记位的引用类型。可以原子更新一个布尔类型的标记位和引用类型。
构造方法是AtomicMarkableReference(V initialRef,booleaninitialMark)。

  1. public class Test38 {
  2. public static void main(String[] args) throws InterruptedException {
  3. GarbageBag bag = new GarbageBag("装满了垃圾");
  4. // 参数2 mark 可以看作一个标记,表示垃圾袋满了
  5. AtomicMarkableReference<GarbageBag> ref = new AtomicMarkableReference<>(bag, true);
  6. log.debug("start...");
  7. GarbageBag prev = ref.getReference();
  8. log.debug(prev.toString());
  9. new Thread(() -> {
  10. log.debug("start...");
  11. bag.setDesc("空垃圾袋");
  12. ref.compareAndSet(bag, bag, true, false);
  13. log.debug(bag.toString());
  14. },"保洁阿姨").start();
  15. sleep(1);
  16. log.debug("想换一只新垃圾袋?");
  17. boolean success = ref.compareAndSet(prev, new GarbageBag("空垃圾袋"), true, false);
  18. log.debug("换了么?" + success);
  19. log.debug(ref.getReference().toString());
  20. }
  21. }
  22. class GarbageBag {
  23. String desc;
  24. public GarbageBag(String desc) {
  25. this.desc = desc;
  26. }
  27. public void setDesc(String desc) {
  28. this.desc = desc;
  29. }
  30. @Override
  31. public String toString() {
  32. return super.toString() + " " + desc;
  33. }
  34. }