Java中的AtomicReference - 在线程安全环境中设置引用所必需的?

Cor*_*ius 5 c# java atomicreference

在Java中,存在AtomicReference类.这是否意味着设置引用本身并不是原子操作?

例如,这是不是线程安全的(假设返回的值不能修改)?:

public void someMethod()
{
   this.someList = Collections.unmodifiableList(new LinkedList<Object>());
}

public List<Object> getReadOnlyList()
{
   return someList;
}
Run Code Online (Sandbox Code Playgroud)

在C#怎么样?

Ste*_*nne 3

根据Java 语言规范 3.0 版第 17.7 节

引用的写入和读取始终是原子的,无论它们是实现为 32 位值还是 64 位值。

AtomicReference 允许将比较和设置作为原子操作执行。

这不是线程安全的:

public boolean changeList(List<Object> oldValue, List<Object> newValue) { 
    if (this.someList == oldValue) {
        // someList could be changed by another thread after that compare,
        // and before this set
        this.someList = newValue;
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)