当前位置: 首页 > news >正文

【java并发编程的艺术读书笔记】volatile关键字介绍、与synchronized的区别

volatile的简介

volatile是轻量级锁,只用来修饰变量,保证这个变量在多线程下的可见性以及一致性(一个volatile变量被线程修改时会立刻通知其他所有线程)防止指令重排序,但是并不能保证绝对的线程安全

  • volatile只能确保单个操作的可见性和禁止重排序,但在涉及多个操作的复合操作中,volatile无法保证这些操作的原子性

  • 当多个线程需要依赖某个条件进行判断和操作时,volatile 无法提供足够的原子性保证,一个线程可能会在检查某个 volatile 变量后决定执行某些操作,但在执行操作之前,其他线程可能已经修改了这个变量的值,导致线程间逻辑错误。

volatile实现原理:CAS + 总线锁

volatile与synchronized的区别

  1. 粒度不同
  • volatile 关键字主要用于保证变量的可见性和禁止指令重排序,即当一个线程修改了一个 volatile 变量的值,其他线程可以立即看到这个变化。但是,volatile 并不能保证复合操作的原子性。
  • synchronized 关键字除了提供可见性外还保证了一段代码块的原子性,即一次只能有一个线程进入同步代码块,从而防止多个线程同时执行这段代码。
  1. 作用范围不同
  • volatile 用于修饰变量,用于保证对该变量的读写操作的可见性。
  • synchronized 用于修饰代码块、方法或静态方法,用于实现线程间的同步和互斥。
  1. 互斥性
  • volatile 不提供互斥性,多个线程可以同时读写一个 volatile 变量,没有限制。
  • synchronized 提供了互斥性,当一个线程进入同步代码块或方法时,其他线程将被阻塞,直到当前线程执行完毕释放锁。
  1. 适用场景不同
  • volatile 适用于那些在多线程环境下进行简单标记、状态判断等操作的情况。它通常用于控制一个变量的可见性,例如在某个标志位被设置时退出一个循环。
  • synchronized 更适用于需要保证数据一致性、复合操作的原子性,以及需要实现线程间的协调和互斥的情况。它可以用于保护共享数据,确保同一时间只有一个线程访问关键代码段。
http://www.lryc.cn/news/142078.html

相关文章:

  • LinkedList的顶级理解
  • 再学http-为什么文件上传要转成Base64?
  • 使用oracleVM搭建虚拟机
  • 深入探讨C存储类和存储期——Storage Duration
  • 医学图像融合的深度学习方法综述
  • 【Qt学习】04:QDialog
  • 如何更好的进行异常处理
  • 若依微服务版部署到IDEA
  • Elasticsearch 入门安装
  • 【80天学习完《深入理解计算机系统》】第十一天 3.5 过程(函数调用)
  • LinuxUbuntu安装VMware tools Segmentation fault (core dumped)怎么解决
  • 002微信小程序云开发API数据库-迁移状态查询/更新索引
  • 十几款拿来就能用的炫酷表白代码
  • 证券低延时环境设置并进行性能测试
  • 百度工程师浅析解码策略
  • windows下实现查看软件请求ip地址的方法
  • 【JAVA】String 类
  • LoRA继任者ReLoRA登场,通过叠加多个低秩更新矩阵实现更高效大模型训练效果
  • Elasticsearch 8.X reindex 源码剖析及提速指南
  • 前端组件库造轮子——Input组件开发教程
  • Day04-Vue基础-监听器-双向绑定-组件通信
  • Java小白基础自学阶段(持续更新...)
  • Vue自定义指令- v-loading封装
  • C++中提供的一些关于查找元素的函数
  • Wlan——STA上线流程与802.11MAC帧讲解以及报文转发路径
  • Python|爬虫和测试|selenium框架模拟登录示例(一)
  • QT的概述
  • Hive 导入csv文件,数据中包含逗号的问题
  • 1、Odoo开发起点
  • Ubuntu22.04 交叉编译树莓派CM4 kernel