首页
题库
面试
求职
学习
竞赛
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收藏
649浏览
热门推荐
相关试题
下面两个传送指令语句中源操作数寻址...
编译和体系结构
评论
(1)
小O的整数操作
贪心
OPPO
基础数学
评论
(1)
设主存容量为256MB,外存容量为...
操作系统
评论
(1)
执行以下程序,输出结果为() le...
Javascript
评论
(1)
在部署大型模型时,模型量化技术的主...
大模型开发
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题