gpt4 book ai didi

java - Java 线程中的实例变量(对象,非原始变量)缓存

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:17 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com