Java 中volatile变量和普通变量的区别(有些小地方不理解)?????

qq_40893433 2018-08-01 08:38:17
volatile变量修改后会立即刷新到内存,每次访问volatile变量会重新从内存中读取 保证了可见性(这个我理解)
但是 难道普通变量修改后不会立即刷新到内存中吗??线程读取普通变量时(工作内存中已经有)直接读取工作内存中的拷贝,但是什么时候知道工作内存的变量已经失效了呢??不能一直读拷贝吧??? 希望得到大家的指教!!!
...全文
397 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
济南大飞哥 2018-08-06
  • 打赏
  • 举报
回复
引用 4 楼 qq_40893433 的回复:
不好意思 我表达有点不清晰。 我的意思是普通变量在线程中更改后,工作内存的数据难道不会立即写到内存中吗???假如说普通共享变量a,在线程中工作内存中都有a的拷贝,当线程1修改a的时候 a的修改指会立即刷新到主内存(共享内存)???还有一个问题线程2什么时候知道自己的工作内存中a的拷贝失效?????volatile我知道 会立即刷新到共享内存中,并且通知别的线程变量失效,线程每次访问volatile变量都是直接去共享内存中读取!!想的脑壳疼!!哈哈

volatile在修改时才会使各个线程的变量失效一次,并不是每次。线程如果已经拷贝了变量,除非接到失效通知,否则就一直读取旧值,但是如果线程里有阻塞方法什么的,还是会读取主内存的变量(我的理解是反正闲着也是闲着),基于1.8。我测试发现1.6是每次尽量读取最新的值,不加volatile有些场景竟然也没有问题。
maradona1984 2018-08-02
  • 打赏
  • 举报
回复
因为CPU有一级二级甚至三级缓存
verejava 2018-08-02
  • 打赏
  • 举报
回复
并发编程 之 volatile 关键字

http://www.verejava.com/?id=1734028422785
qq_40893433 2018-08-02
  • 打赏
  • 举报
回复
感谢各位的答复!!灰常感谢!!希望大家共同进步!!
qq_40893433 2018-08-02
  • 打赏
  • 举报
回复
不好意思 我表达有点不清晰。 我的意思是普通变量在线程中更改后,工作内存的数据难道不会立即写到内存中吗???假如说普通共享变量a,在线程中工作内存中都有a的拷贝,当线程1修改a的时候 a的修改指会立即刷新到主内存(共享内存)???还有一个问题线程2什么时候知道自己的工作内存中a的拷贝失效?????volatile我知道 会立即刷新到共享内存中,并且通知别的线程变量失效,线程每次访问volatile变量都是直接去共享内存中读取!!想的脑壳疼!!哈哈
爱若如梦 2018-08-01
  • 打赏
  • 举报
回复
volatile变量一旦修改,会直接写主存,同时cpu会让使用此变量的缓存行失效,使用时重新从主存读取。适合一写多读的场景

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧