首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
请你说一下volatile
[问答题]
请你说一下volatile
查看答案及解析
添加笔记
求解答(0)
邀请回答
收藏(17)
分享
纠错
2个回答
添加回答
0
HoraceDH
链接:
https://www.nowcoder.com/questionTerminal/10add92ec14c43808fb3ec96d1271197
来源:牛客网
1、volatile是一个Java的关键字,用来解决内存可见性问题的。
2、当多个线程操作共享变量时,会存在数据不一致的问题。因为在Java内存模型中,有工作内存和主内存,每个线程都有自己的工作内存,里边存储变量的副本,当对一个普通变量进行写操作时,不会立即同步到主内存,因此其他线程不能立即看到最新的值,这就是内存可见性问题。
3、通过volatile关键字修饰的变量可以解决这个问题,JVM底层是通过内存屏障来实现,当对一个变量进行读取时,插入读屏障,表示先从主内存读取,当对一个变量进行写入后,插入写屏障,表示立即同步到主内存,这样就解决了可见性问题,保证了数据一致性,对应于硬件层面,看到资料说是Intel提供了缓存一致性协议MESI,对共享变量写入时,发出通知让其他CPU核心缓存行失效,早期的CPU是通过对总线加锁的方式实现。
4、但volatile不能解决原子性问题,因为每个线程都有工作内存,各自线程计算完后同步到主内存会存在覆盖的问题。
5、volatile的使用场景一般用在于一个线程读,另一个线程写的情况下,例如标志位这类,同时读写一个volatile的场景不适合,因为会出现原子性问题。
发表于 2022-06-25 09:25:21
回复(0)
0
Showr
volatile用在多线程中修饰变量,使得该变量修改后立即可见,即可见性
同时禁止指令重排序,但是不保证原子性
发表于 2019-09-06 15:49:49
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
上传者:
小小
难度:
2条回答
17收藏
594浏览
热门推荐
相关试题
设A,B是两个n阶方阵,其中B是对...
概率论与数理统计
评论
(1)
来自
2024年秋招-蚂蚁集团...
考虑以下关于 Go 接口和 nil...
Go
评论
(1)
在商品表中查询价格高于平均价格的条...
SQL
评论
(1)
分析销售数据时,需要为每个订单计算...
SQL
评论
(1)
关于Go语言的内存管理与GC,下列...
Go
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题