首页 > 解决方案 > Java线程中的实例变量(对象,不是原始)缓存

问题描述

Java 线程是缓存 Instance 变量还是在所有线程之间共享?

Class CachedObject{
    MyClass object1 = new MyClass();

    public void changeValue(int i){
        object1.setValue(i);
    }
}

让我们假设,该changeValue方法将被多个线程访问,然后object1将被缓存在每个线程缓存中还是共享?

我知道synchronized并且如果我使用synchronized方法一切都会好的,但我在这里特别询问线程缓存。我知道局部变量缓存在线程缓存中,但我对 Instance 变量感到困惑。谢谢..

标签: javamultithreadingcaching

解决方案


线程本身不缓存任何东西。
但是线程读取/写入不同的内存数据,它根据 CPU 线程模型读取/写入。
因此,可能需要在线程之间与主内存同步。
在您的情况下,如果您创建在多个线程之间共享的单个实例,则如果以这种方式实现CachedObject,新object1状态可能不会更新/对其他线程可见:setValue()

public void setValue(int i){
   this.value = i;
}

因为它在没有任何同步的情况下为字段分配新值,int因此可能仅对当前线程可见。

但是通过这些方式,您将不会遇到问题:

private int volatile value;
public void setValue(int i){      
   this.value = i;
}

或者 :

public void setValue(int i){
   synchronized(this){
      this.value = i;
   }
}

推荐阅读