Java 变量是否可以在其引用交换时访问?

Java 变量是否可以在其引用交换时访问?,java,concurrency,reference,swap,Java,Concurrency,Reference,Swap,Java:我有一个共享变量(对象类型),它的值会被不同的线程频繁更改。 通过另一组线程从其他方法访问此变量的值,将给出任何损坏的值(根本没有分配的值)? 在引用交换时访问变量时是否会发生任何问题 // this method will be called very frequently public void changeValue(Object value) { this.value = value; } // will this method call return an inva

Java:我有一个共享变量(对象类型),它的值会被不同的线程频繁更改。 通过另一组线程从其他方法访问此变量的值,将给出任何损坏的值(根本没有分配的值)? 在引用交换时访问变量时是否会发生任何问题

// this method will be called very frequently
public void changeValue(Object value)
{
    this.value = value;
}

// will this method call return an invalid memory reference ?
public Object getValue()
{
    return value;
}

getter将始终返回一个有效对象(如果未设置任何对象,则返回null)。它可能返回旧的值。如果您想对此进行反击,可以将
synchronized
添加到方法中。但这将使线程在设置时互相等待,getter将始终返回有效对象(如果未设置任何对象,则返回null)。它可能返回旧的值。如果您想对此进行反击,可以将
synchronized
添加到方法中。但这将使线程在设置时互相等待,即使同时修改,该值也将是有效对象


但是,如果您尝试使用
java.util.List
java.util.Map
或其他集合持有者执行此操作,如果您在另一个线程中迭代该集合时修改该集合的值集,则会遇到
ConcurrentModificationException
,在这种情况下,最好的方法是使用
synchronized
关键字修改getter和setter方法,或者对集合本身使用synchronized块。

即使同时修改,该值也将是有效的对象


但是,如果您尝试使用
java.util.List
java.util.Map
或其他集合持有者执行此操作,如果您在另一个线程中迭代该集合时修改该集合的值集,则会遇到
ConcurrentModificationException
,在这种情况下,最好的方法是使用
synchronized
关键字修改getter和setter方法,或者对集合本身使用同步块。

用于存储
变量。

用于存储
变量。

对象引用在原子操作中处理。请参阅和极好的答案。

对象引用是在原子操作中处理的。请参阅和极好的答案。

将新对象分配给变量是一种原子操作,但如果不使引用变为易变引用,或不同步对此引用的访问,或使用原子引用,则会出现可见性问题并看到过时的值。

将新对象分配给变量是一种原子操作,但是,如果不将引用设置为volatile,或不同步对此引用的访问,或不使用AtomicReference,则会出现可见性问题并看到过时的值。

如果将值声明为volatile,或将访问方法声明为synchronized,则会出现问题。

Now problem,如果您将值声明为volatile或将访问方法声明为synchronized。

我认为在这种情况下,这对
volatile
没有额外的作用(尽管这种情况可能并不安全)。我认为在这种情况下,这对
volatile
没有额外的作用(尽管这种情况可能并不安全).能见度问题?你的意思是新值不可见。是的。在多核架构中,每个核心都有自己的缓存,写入线程中的变量并不保证其他线程会看到新值,因为它们可能仍然会看到存储在处理器缓存中的值。使用volatile、synchronized或atomic引用解决了这个问题。阅读可见性问题?你的意思是新值不可见。是的。在多核架构中,每个核心都有自己的缓存,写入线程中的变量并不保证其他线程会看到新值,因为它们可能仍然会看到存储在处理器缓存中的值。使用volatile、synchronized或atomic引用解决了这个问题。阅读