Java线程会缓存Instance变量还是会在所有线程之间共享它?
Class CachedObject{
MyClass object1 = new MyClass();
public void changeValue(int i){
object1.setValue(i);
}
}
假设,changeValue
方法将被多个线程访问,那么object1
将被缓存在每个线程缓存中还是被共享?
我知道synchronized
,如果我在方法上使用synchronized
,一切都会好的,但我在这里特别询问线程缓存。
我知道局部变量缓存在线程缓存中,但我对实例变量感到困惑。
谢谢..
最佳答案
线程本身不缓存任何内容。
但是线程根据 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;
}
}
关于java - Java 线程中的实例变量(对象,非原始变量)缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53701545/