我们可以在Java中使用AtomicEnum吗?

Joh*_*nny 6 java enums multithreading volatile synchronized

今天我看到了AtomicEnum的这个实用程序类,但我想知道是否有可能有原子枚举为什么它不包含在Java标准库中?事实上,我非常怀疑它是否真的是原子的,如果这个实用程序类有效.

AtomicEnum类是这样的

  1. 我如何检查它是否以原子方式执行操作?
  2. 是否有一个工具可以查看已编译的代码,并确保它只在一个机器指令中完成所有操作?
  3. 是否有可能从代码中发现它?
  4. 因此,如果这个Atomic枚举工作,我可以有一个属性AtomicEnum,它可以安全地使用它没有volatile关键字和同步的getter和setter?

Gra*_*ray 17

今天我看到了AtomicEnum的这个实用程序类,但我想知道是否有可能有原子枚举为什么它不包含在Java标准库中?

AtomicEnum您链接类只是包裹AtomicReference这使得任何并发访问类Object.

volatile enumField如果你有多个线程正在获取并同时设置它,那么真的是你需要的.该volatile关键字确保其他线程可以看到一个线程所做的更新.AtomicReference如果需要执行某种compareAndSet(...)方法,则需要使用- 如果字段是特定值,则进行原子测试,然后才更新它.

我如何检查它是否以原子方式执行操作?

AtomicReferencejava.util.concurrent经过充分测试的课程的一部分.

是否有一个工具可以查看已编译的代码,并确保它只在一个机器指令中完成所有操作?

这不应该是必要的.AtomicReference如果您想知道它在做什么,您可以查看源代码.不幸的是,真正的魔力在于本sun.misc.Unsafe机代码.

是否有可能从代码中发现它?

这不应该是必要的.

因此,如果这个Atomic枚举工作,我可以有一个属性AtomicEnum,它可以安全地使用它没有volatile关键字和同步的getter和setter?

是的,AtomicReference包装一个,volatile V value所以你不必这样做.

  • 不,它只保护参考.如果你想拥有一个可变对象,那么你需要更多地进行同步. (3认同)
  • @Gray:好提一下:"*默认情况下*":通过在你的枚举中添加可变字段,你可以很容易地"破坏"它的线程安全性!不要那样做. (3认同)
  • 我们使用`volatile`的原因是因为内存同步.如果一个线程更改了共享枚举,则其他线程不一定会看到更新.我们使用`AtomicReference`的原因是我们可以原子地`compareAndSet(...)`.如果你不需要原子方法(即你只是设置或得到它),那么`volatile enumField`就足够了.但如果你有多个线程,你需要`volatile` @Johnny. (2认同)