首页 文章

Java线程中的实例变量(对象,而不是原始)缓存

提问于
浏览
1

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

Class CachedObject{
    MyClass object1 = new MyClass();

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

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

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

1 回答

  • 0

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

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

相关问题