返回信息流i是个int类型,并且是个多个线程的共享变量。
i=1这个操作是一个原子操作吗?如果不是,包含几个?都是什么?
疑惑点:
两个原子操作:先赋值,然后writte到主存
一个原子操作:直接赋值到主存。不经过线程的本地内存。
求教,疑惑了好几天了。也没有找到合适的答案。
这是一条镜像帖。来源:北邮人论坛 / java / #58132同步于 2017/11/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
向高手求教 java 直接赋值,原子操作的问题
liuhongbibo
2017/11/23镜像同步16 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
恩,估计我理解的有误区
那从此线程的缓存中,刷新到内存中,是个原子操作吗?
Java内存模型(JMM)规定了jvm有主内存,主内存是多个线程共享的。当new一个对象的时候,也是被分配在主内存中,每个线程都有自己的工作内存,工作内存存储了主存的某些对象的副本,当然线程的工作内存大小是有限制的。当线程操作某个对象时,执行顺序如下:
(1) 从主存复制变量到当前工作内存 (read and load)
(2) 执行代码,改变共享变量值 (use and assign)
(3) 用工作内存数据刷新主存相关内容 (store and write)
i=1 包含了几个原子操作?就是 包括 read,load,use,assign,store,write的几个
这个就不清楚了。我查了下说缓存写入到内存这个是原子操作
【 在 liuhongbibo 的大作中提到: 】
: 恩,估计我理解的有误区
: 那从此线程的缓存中,刷新到内存中,是个原子操作吗?
: Java内存模型(JMM)规定了jvm有主内存,主内存是多个线程共享的。当new一个对象的时候,也是被分配在主内存中,每个线程都有自己的工作内存,工作内存存储了主存的某些对象的副本,当然线程的工作内存大小是有限制的。当线程操作某个对象时,执行顺序如下:
: ...................
"i=1;"是写操作,就是一个原子操作,原子操作意味着该操作不可再分,这里就是lock、unlock、read,load,use,assign,store,write中的assign(不太清楚)
但是,由于i不加volatile关键字,即不保证可见性以及有序性(编译器可能会对相邻位置的读写操作进行适当的重排序),即在执行完毕"i=1;"之后,别的线程可能看到的是赋值前的值,也可能看到赋值后的值。
可以理解为"i=1;"执行后,可能i的值可能立即从"线程私有工作内存"刷新到"主内存",也可能过一段时间才从"线程私有工作内存"刷新到"主内存"
对于需要读取i的值的其他线程,如果"线程私有工作内存"中i的值尚有效,那么可能完全不知道别的线程对i进行了修改,而直接使用了"线程私有工作内存"中i的值
如果,当加了volatile关键字后,"volatile 写"操作之后,立即会将数据"线程私有工作内存"刷新到"主内存";而"volatile 读"操作,会将"线程私有工作内存"中对应的变量的缓存设置为无效,从而从"主存"中读取,从而保证了可见性(此外,volatile还有一系列禁止重排序的规则来保证有序性,这是通过插入内存屏障来实现的)
不要纠结于Java语法层面的原子性,几乎哪一句都不满足原子性,重要的是顺序和可见性。
比如volatile,保证“如果写操作发生在读之前,那么一定能读到写操作的最新值”,这在作用上与原子性是相同,但实际上用了一系列操作完成,通过顺序保障可见性,并不是不可分割的。
【 在 liuyehcf 的大作中提到: 】
: "i=1;"是写操作,就是一个原子操作,原子操作意味着该操作不可再分,这里就是lock、unlock、read,load,use,assign,store,write中的assign(不太清楚)
: 但是,由于i不加volatile关键字,即不保证可见性以及有序性(编译器可能会对相邻位置的读写操作进行适当的重排序),即在执行完毕"i=1;"之后,别的线程可能看到的是赋值前的值,也可能看到赋值后的值。
: 可以理解为"i=1;"执行后,可能i的值可能立即从"线程私有工作内存"刷新到"主内存",也可能过一段时间才从"线程私有工作内存"刷新到"主内存"
: ...................
多谢,很透彻了。已给点赞加积分。
【 在 forienlauo 的大作中提到: 】
: 不要纠结于Java语法层面的原子性,几乎哪一句都不满足原子性,重要的是顺序和可见性。
: 比如volatile,保证“如果写操作发生在读之前,那么一定能读到写操作的最新值”,这在作用上与原子性是相同,但实际上用了一系列操作完成,通过顺序保障可见性,并不是不可分割的。
恩,就是想知道的更清楚明白点,多谢帮助