AtomicMarkableReference是什么

使用Boolean作为标记,检查引用变量是否修改过。

实例

AtomicMarkableReference详解 - 图1

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

01:20:27.060 c.Test38 [main] - start... 01:20:27.061 c.Test38 [main] - cn.itcast.test.GarbageBag@61baa894 装满了垃圾 01:20:27.090 c.Test38 [保洁阿姨] - start... 01:20:27.090 c.Test38 [保洁阿姨] - cn.itcast.test.GarbageBag@61baa894 空垃圾袋 01:20:28.104 c.Test38 [main] - 想换一只新垃圾袋? 01:20:28.104 c.Test38 [main] - 换了么?false 01:20:28.104 c.Test38 [main] - cn.itcast.test.GarbageBag@61baa894 空垃圾袋