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虚拟机>时,对工作内存、主内存之间的交互操作有些困惑,希望大神开导指点
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
2是,1有点微妙,详细说一下。
int a = 1
在java中叫显式初始化,它实际上包含两次赋值,第一次java自动将a初始化为0,第二次再赋值为1。从这个角度看,这条语句包含了两步操作,并不是原子的。但是由于这句代码是在构造方法中,而从类的实例化角度看,一般认为构造方法中对当前实例的初始化过程是原子的。这是因为在实例化完成之前,一般是无法从别的代码中访问到当前实例的。所以从这个角度看,1在实际上是原子的。
1 .不是。2 不是。
先答一下:
1和2都是原子性操作。
在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可中断的,要么执行完毕,要么就不执行。
打个比方
这里面的操作只有语句1和语句2是原子性的操作,语句3,4不是原子性的操作;因为在语句3中包括了三个操作,1是先读取x的值,2读取y的值,3将z的值写入内存中。语句4的解释是一样的。一般的一个语句含有多个操作该语句就不是原子性的操作,只有简单的读取和赋值才是原子性的操作。
本例中,如果是
test.a++
那就不是原子性操作了。另外,test.a=2
并没有涉及到读取,而是直接把值传递给了主内存进行赋值(匿名内部类可以访问到main线程的test实例对象)可以详细读下《深入理解JVM虚拟机》JMM那章的内容 或者 本人这篇博客Java 内存模型