java - volatile 关键字也适用于非基元

2022-09-03 01:22:35

我不确定 volatile 关键字是否也应该用于非基元。我有一个类成员,它由一个线程设置/分配,并由另一个线程访问。我应该声明此成员为易失性吗?

private /* volatile */ Object o;

public void setMember(Object o) {
    this.o = o;
}

public Object getMember() {
    return o;
}

在这里,setMember(...) 由一个线程调用,getMember() 由另一个线程调用。

例如,如果它是布尔值,答案将是肯定的。

我使用的是Java 1.4,在这种情况下,成员是只读的。因此,在这种情况下,我只关心可见性,因此我的问题是关于不稳定的关键字。


答案 1

是 - 对于引用类型字段具有与对基元类型字段完全相同的意义。除了在引用类型的情况下,字段引用的对象的成员也必须设计为多线程访问。volatile


答案 2

您可以,也可能有所帮助,但请记住,关键字仅适用于引用的设置。它对该对象内属性的多线程可见性没有影响。如果它是有状态的,则可能无论如何都要围绕对它的每个访问进行同步,以确保所需的“发生之前”关系。


推荐