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

标签 java multithreading caching

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/

相关文章:

java - 为什么我的 Java 程序在高负载下关闭时没有任何错误消息?

java - 无法在 Jersey/java 中调用 webservice 方法

java - 当我们拥有currentThread()方法时,为什么Thread类具有静态方法?

multithreading - 将 hibernate 与多线程套接字服务器一起使用

python - 通过序列化或内存中 KV 存储缓存 Pandas Dataframe

node.js - 为什么 Node 需要缓存填满和泄漏

java - 如何编写一个程序将二进制数转换为十进制数而不使用 lang 类?

java - 如何在 IntelliJ 中将资源文件添加到 JAR

c# - 如何使静态变量线程安全

php - 定期用查询填充 View 数据