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;
}
答案 0 :(得分:4)
将新对象分配给变量是一种原子操作,但是如果不使用引用volatile,或者同步对此引用的访问,或者使用AtomicReference,则会出现可见性问题并看到陈旧值。
答案 1 :(得分:1)
对象引用在原子操作中处理。请参阅Java Language Specification 17.4和优秀答案here。
答案 2 :(得分:0)
getter将始终返回一个有效对象(如果没有设置,则返回null)。它可能会返回旧值。如果要对此进行计数,可以将synchronized
添加到方法中。但这会使线程在设置
答案 3 :(得分:0)
即使同时修改,该值也将是一个有效对象。
但是,如果您尝试对java.util.List
,java.util.Map
或其他收藏集持有人执行此操作,则在修改集合的值集时会遇到ConcurrentModificationException
在另一个线程中迭代它时,在这种情况下,最好的方法是使用synchronized
关键字修改getter和setter方法,或者在集合本身上使用synchronized块。
答案 4 :(得分:0)
使用AtomicReference存储您的value
变量。
答案 5 :(得分:0)
现在出现问题,只要将声明的值声明为volatile或访问方法为synchronized。