2020-09-29:介绍volatile功能。

福大大架构师每日一题 2020-09-29 07:03:21
2020-09-29:介绍volatile功能。#福大大架构师每日一题#
...全文
2617 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
苜苜的烂笔头 2020-09-29
  • 打赏
  • 举报
回复
修饰公共变量,保证变量在多线程环境中保证可见性和有序性。
KeepSayingNo 2020-09-29
  • 打赏
  • 举报
回复
保证被修饰的变量对应多线程是可见的,还可以控制CPU的指令重排,保证线程的执行顺序
澜风yf 2020-09-29
  • 打赏
  • 举报
回复
Java 提供了 volatile 关键字来保证可见性和禁止指令重排。 volatile 提供 happens-before 的保证,确保一个线程的修改能对其他线程是可见的。当一个共享变量被 volatile 修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。 从实践角度而言,volatile 的一个重要作用就是和 CAS 结合,保证了原子性,详细的可以参见 java.util.concurrent.atomic 包下的类,比如 AtomicInteger。 volatile 常用于多线程环境下的单次操作(单次读或者单次写)。 关键字volatile的主要作用是使变量在多个线程间可见,但无法保证原子性,对于多个线程访问同一个实例变量需要加锁进行同步。 volatile 表示变量在 CPU 的寄存器中是不确定的,必须从主存中读取。保证多线程环境下变量的可见性;禁止指令重排序。 volatile与synchronized的 区别: - volatile 是变量修饰符;synchronized 可以修饰类、方法、变量。 - volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。 - volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。 - volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。 - volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用 synchronized 关键字的场景还是更多一些。
亦夜 2020-09-29
  • 打赏
  • 举报
回复
保证可见性,不保证原子性,禁止指令重排
  • 打赏
  • 举报
回复
百度搜索【福大大架构师每日一题】
  • 打赏
  • 举报
回复
https://blog.csdn.net/weixin_43876121/article/details/107445595

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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