0

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;
}
4

6 回答 6

4

Assigning a new Object to a variable is an atomic operation, but if you don't make the reference volatile, or synchronize access to this reference, or use an AtomicReference, you will have visibility problems and see stale values.

于 2012-09-26T13:28:18.093 回答
1

对象引用在原子操作中处理。请参阅Java 语言规范 17.4和此处的优秀答案。

于 2012-09-26T13:27:46.330 回答
0

getter 将始终返回一个有效的对象(或 null,如果没有设置)。它可能会返回较旧的值。如果你想解决这个问题,你可以添加synchronized到方法中。但这会使线程在设置时相互等待

于 2012-09-26T13:26:52.563 回答
0

该值将是一个有效的对象,即使同时被修改。

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

于 2012-09-26T13:27:19.527 回答
0

使用AtomicReference来存储您的value变量。

于 2012-09-26T13:27:30.727 回答
0

Now problem, provided you declared value as volatile or access methods as synchronized.

于 2012-09-26T13:31:01.907 回答