public class Test {
int a=1;
public static void main(String[] args) {
Test test = new Test();
new Thread(new Runnable() {
@Override
public void run() {
test.a =2;
}
}).start();
}
}
场景描述:Test类具有成员变量int a,初始化时赋值为1, main方法中声明对象test,启动线程修改test的成员变量a的值为2。
我想问:
1.test对象实例化时,关于 int a=1;这一步是原子操作么?如果是对应jvm工作内存、主内存是如何分配、拷贝的。
2.main中启动的线程对a的修改 ,是原子操作么?如果是对应jvm工作内存、主内存是如何分配、拷贝的。
最近学习<深入理解JVM虚拟机>时,对工作内存、主内存之间的交互操作有些困惑,希望大神开导指点
2是,1有点微妙,详细说一下。
int a = 1
在java中叫显式初始化,它实际上包含两次赋值,第一次java自动将a初始化为0,第二次再赋值为1。从这个角度看,这条语句包含了两步操作,并不是原子的。但是由于这句代码是在构造方法中,而从类的实例化角度看,一般认为构造方法中对当前实例的初始化过程是原子的。这是因为在实例化完成之前,一般是无法从别的代码中访问到当前实例的。所以从这个角度看,1在实际上是原子的。