可以在参考交换时访问变量吗?

时间:2012-09-26 13:20:20

标签: java concurrency reference swap

Java:我有共享变量(类型为Object),其值将由不同的线程非常频繁地更改。 通过其他一组线程从其他方法访问此变量的值将给出任何损坏的值(未分配的值)? 在引用交换时访问变量时是否会发生任何问题???

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

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

对象引用在原子操作中处理。请参阅Java Language Specification 17.4和优秀答案here

答案 2 :(得分:0)

getter将始终返回一个有效对象(如果没有设置,则返回null)。它可能会返回旧值。如果要对此进行计数,可以将synchronized添加到方法中。但这会使线程在设置

时等待对方

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

使用AtomicReference存储您的value变量。

答案 5 :(得分:0)

现在出现问题,只要将声明的值声明为volatile或访问方法为synchronized。