可变原子引用是个坏主意吗?
当然不!AtomicReference
旨在提供底层引用的线程安全、原子更新。实际上,AtomicReference 的 Javadoc 描述是:
可以自动更新的对象引用。
所以它们绝对是为了变异而设计的!
这安全吗?
这取决于您所说的“安全”是什么意思,以及您的其余代码在做什么。孤立的代码片段本身并没有什么不安全的地方。在 AtomicReference 上同步是完全有效的,尽管可能有点不寻常。作为不熟悉此代码的开发人员,我会看到同步reference
并假设这意味着可能随时替换底层对象,并且您希望确保您的代码始终在“最新”引用上运行。
适用于同步的标准最佳实践,违反它们可能会导致不安全的行为。例如,由于您说performSomeModification()
不是线程安全的,因此如果您在其他地方访问底层对象而不同步 on ,那将reference
是不安全的。
public void bar(AtomicReference reference) {
// no synchronization: performSomeModification could be called on the object
// at the same time another thread is executing foo()
reference.get().performSomeModification();
}
如果您的应用程序要求在任何时候只对底层对象的一个实例进行操作,并且您在 .set() 时没有在引用上同步它,那么 if 也可能是“不安全的”:
public void makeNewFoo(AtomicReference reference) {
// no synchronication on "reference", so it may be updated by another thread
// while foo() is executing performSomeModification() on the "old" reference
SomeObject foo = new SomeObject();
reference.set(foo);
}
如果您需要在 AtomicReference 上进行同步,那么这样做是非常安全的。但我强烈建议您添加一些代码注释来说明您这样做的原因。