java - Java线程中的实例变量(对象,不是原始)缓存
问题描述
Java 线程是缓存 Instance 变量还是在所有线程之间共享?
Class CachedObject{
MyClass object1 = new MyClass();
public void changeValue(int i){
object1.setValue(i);
}
}
让我们假设,该changeValue
方法将被多个线程访问,然后object1
将被缓存在每个线程缓存中还是共享?
我知道synchronized
并且如果我使用synchronized
方法一切都会好的,但我在这里特别询问线程缓存。我知道局部变量缓存在线程缓存中,但我对 Instance 变量感到困惑。谢谢..
解决方案
线程本身不缓存任何东西。
但是线程读取/写入不同的内存数据,它根据 CPU 线程模型读取/写入。
因此,可能需要在线程之间与主内存同步。
在您的情况下,如果您创建在多个线程之间共享的单个实例,则如果以这种方式实现CachedObject
,新object1
状态可能不会更新/对其他线程可见:setValue()
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;
}
}
推荐阅读
- user-interface - Nukear OpenGL 闪烁问题
- javascript - 在 mouseenter 上启动计时器并在另一个 div 条目上清除
- assembly - 在 x86 实模式引导加载程序中应如何初始化堆栈以防止与 BIOS 冲突?
- php - Codeigniter 查询生成器无法正常工作
- c# - System.Diagnostics.Process.Start() 参数 dotnet 和 diff
- python - 在对象方法中产生后睡眠不起作用python
- kubernetes - 我无法进入 azure kubernetes pod
- java - 如何在它自己的方法中创建一个数组对象
- mysql - MySQL RDS 数据库实例崩溃,错误代码 6
- xcode - 归档时未找到 Xcode 自定义框架