首页 > 试题广场 >

请你说一下volatile

[问答题]
链接: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)
volatile用在多线程中修饰变量,使得该变量修改后立即可见,即可见性
同时禁止指令重排序,但是不保证原子性
发表于 2019-09-06 15:49:49 回复(0)