Java线程中的实例变量(对象,不是基本类型)缓存

时间:2018-12-10 07:57:00

标签: java multithreading caching

Java线程是否缓存Instance变量,或者它将在所有线程之间共享?

Class CachedObject{
    MyClass object1 = new MyClass();

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

假设,changeValue方法将被多个线程访问,然后object1将被缓存在每个线程缓存中或将被共享?

我了解synchronized,如果我在方法上使用了synchronized,一切都会好起来的,但是我在这里特别询问线程缓存。 我知道局部变量被缓存在线程缓存中,但是我对实例变量感到困惑。 谢谢。

1 个答案:

答案 0 :(得分:0)

线程本身不会缓存任何内容。
但是线程根据CPU线程模型在不同的内存数据中进行读写操作。
因此,可能需要与线程之间的主内存进行同步。
在您的情况下,如果您创建一个UserComponent的实例,该实例在多个线程之间共享,则以这种方式实现的router-outlet可能不会为其他线程更新/显示新的CachedObject状态:

object1

因为它为setValue()字段分配了一个新值,而没有任何仅对当前线程可见的同步。

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

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

或:

int