java中,对象的int基本类型的成员变量赋值,是原子操作么?

新手上路,请多包涵

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虚拟机>时,对工作内存、主内存之间的交互操作有些困惑,希望大神开导指点

阅读 7.4k
3 个回答

2是,1有点微妙,详细说一下。
int a = 1在java中叫显式初始化,它实际上包含两次赋值,第一次java自动将a初始化为0,第二次再赋值为1。从这个角度看,这条语句包含了两步操作,并不是原子的。
但是由于这句代码是在构造方法中,而从类的实例化角度看,一般认为构造方法中对当前实例的初始化过程是原子的。这是因为在实例化完成之前,一般是无法从别的代码中访问到当前实例的。所以从这个角度看,1在实际上是原子的。

新手上路,请多包涵

1 .不是。2 不是。

先答一下:

1和2都是原子性操作。

在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可中断的,要么执行完毕,要么就不执行

打个比方

x =3;    //语句1

y =4    //语句2

z = x+y ;//语句3

x++;    //语句4

这里面的操作只有语句1和语句2是原子性的操作,语句3,4不是原子性的操作;因为在语句3中包括了三个操作,1是先读取x的值,2读取y的值,3将z的值写入内存中。语句4的解释是一样的。一般的一个语句含有多个操作该语句就不是原子性的操作只有简单的读取和赋值才是原子性的操作

本例中,如果是test.a++那就不是原子性操作了。另外,test.a=2并没有涉及到读取,而是直接把值传递给了主内存进行赋值(匿名内部类可以访问到main线程的test实例对象)

可以详细读下《深入理解JVM虚拟机》JMM那章的内容 或者 本人这篇博客Java 内存模型

推荐问题
宣传栏