【Java】 volatile 和 synchronized 的比较及使用场景
在 Java 的并发编程中,volatile 和 synchronized 是两个常用的关键字,它们分别用于保证多线程环境中的 可见性 和 原子性,但它们的工作原理和适用场景却有所不同。今天,我们将深入探讨这两个关键字的异同,帮助大家理解它们的使用场景和选择方式。
1. volatile 关键字
功能简介
volatile
是 Java 中的一个轻量级同步机制,它用来确保 变量的可见性。当一个线程修改了 volatile
变量的值,其他线程能够立即看到修改后的值。它通过 内存屏障 来禁止编译器和 CPU 对 volatile
变量的重排序,确保每次读取都是从主内存中获取最新的值。
使用场景
volatile
主要用于以下两种场景:
- 状态标志:通常用于线程之间的状态通信。例如,线程池中常用一个
volatile
标志来通知线程是否需要停止执行。 - 单一变量的可见性:当你需要保证多个线程对同一变量的修改是可见的,而不需要操作的原子性时,
volatile
是一个不错的选择。
示例代码
public class VolatileExample {private volatile boolean flag = false;public void setFlag() {flag = true;}public boolean checkFlag() {return flag;}
}
在这个例子中,volatile
确保了 flag
变量在多个线程中是可见的,即当一个线程修改了 flag
的值,其他线程能够立即看到这个变化。
优缺点
优点:
- 轻量级,性能较好。
- 简单易用,避免了使用
synchronized
带来的开销。
缺点:
- 只保证 可见性,不能保证 原子性。对于复合操作(如
i++
),volatile
并不适用。
2. synchronized
关键字
功能简介
synchronized
是 Java 中的同步机制,它可以保证 原子性 和 可见性。使用 synchronized
可以确保在同一时刻只有一个线程可以执行某个方法或代码块,其他线程必须等待锁的释放。synchronized
确保了对共享资源的访问是安全的。
使用场景
synchronized
适用于需要对共享资源进行 复合操作 的场景,尤其是当多个线程同时修改共享数据时。例如:
- 多线程环境下对共享数据的读写操作。
- 确保操作的原子性,避免数据的竞争和不一致。
示例代码
public class SynchronizedExample {private int count = 0;public synchronized void increment() {count++;}public synchronized int getCount() {return count;}
}
在这个例子中,synchronized
确保了 increment
和 getCount
方法在多线程环境下的线程安全。只有一个线程能够访问这两个方法,避免了并发问题。
优缺点
优点:
- 保证 原子性 和 可见性,适用于复杂的并发操作。
- 适用于保护临界区代码,防止数据竞态。
缺点:
- 性能开销较大,每次进入
synchronized
方法或代码块时,都需要获取锁,离开时需要释放锁。这会导致线程上下文切换,影响性能。 - 容易引发 死锁 问题,如果不小心使用锁的顺序,会导致线程互相等待,造成程序无法继续执行。
3. volatile
和 synchronized
的对比
特性 | volatile | synchronized |
---|---|---|
保证的功能 | 仅保证变量的 可见性 | 保证 原子性 和 可见性 |
适用场景 | 适用于简单的标志变量(如停止线程标志) | 适用于需要对共享资源进行原子操作的场景 |
性能开销 | 性能较好,无锁开销 | 性能开销较大,需要线程上下文切换和加锁操作 |
原子性 | 不保证(例如自增操作 i++ 是非原子操作) | 保证(确保对共享变量的原子修改) |
实现方式 | 通过内存屏障确保可见性 | 通过锁机制保证互斥访问 |
使用简单性 | 简单,只涉及变量声明和使用 | 需要额外的加锁和解锁操作 |
适用于复合操作 | 不适合复合操作(例如自增、判断并更新等) | 适合复合操作(如自增、自减等复杂操作) |
线程竞争 | 无锁开销,但只能保证可见性,无法避免线程竞争 | 可以避免线程竞争,保证操作的完整性 |
4. 何时选择 volatile
,何时选择 synchronized
?
选择 volatile
:
- 简单的变量控制:如果你只需要确保变量的可见性,并且操作是简单的读写操作(如状态标志),
volatile
是更优的选择。 - 性能敏感的场景:由于
volatile
没有锁的开销,性能上会优于synchronized
。
选择 synchronized
:
- 复合操作:如果你的操作涉及多个步骤(例如
i++
,或多个值的修改),volatile
无法保证原子性,这时应该使用synchronized
。 - 多线程共享数据的场景:在多个线程同时修改同一数据时,
synchronized
可以确保数据的安全性和一致性。
5. 总结
volatile
和 synchronized
是 Java 中两种常用的并发控制机制。volatile
提供了轻量级的可见性保障,适用于简单的场景,但不能保证原子性;而 synchronized
提供了强大的原子性保障,适用于复杂的并发操作,但会带来较大的性能开销。
在实际开发中,选择哪种机制取决于你的具体需求:
- 如果只是需要确保变量的可见性,使用
volatile
更为高效。 - 如果需要保证多个操作的原子性或保护共享资源的访问,使用
synchronized
更为合适。
理解它们的原理和适用场景,将帮助你在并发编程中做出更加合理的选择。
相关文章:
【Java】 volatile 和 synchronized 的比较及使用场景
在 Java 的并发编程中,volatile 和 synchronized 是两个常用的关键字,它们分别用于保证多线程环境中的 可见性 和 原子性,但它们的工作原理和适用场景却有所不同。今天,我们将深入探讨这两个关键字的异同,帮助大家理解…...
javaScript简单版
简介 JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言,是用来控制网页行为,实现页面的交互效果。 JavaScript和Java是完全不同的语言,不论是概念还是设计。但是基础语法类似。 组成: ECMAScript:规定了JS基础语法核心知…...
三种常见接口测试工具(Apipost、Apifox、Postman)
三种常见接口测试工具(Apipost、Apifox、Postman)的用法及优缺点对比总结: 🔧 一、Apipost ✅ 基本用法 支持 RESTful API、GraphQL、WebSocket 等接口调试自动生成接口文档支持环境变量、接口分组、接口测试用例编写可进行前置…...
蓝桥杯13届国B 完全日期
题目描述。 如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。 例如:2021 年 6 月 5 日的各位数字之和为 20216516,而 16 是一个完全平方数,它是 4 的平方。所以 2021 年 6 月 5 日是一个完全日期。 例如&…...
kafka connect 大概了解
kafka connect Introduction Kafka Connect is the component of Kafka that provides data integration between databases, key-value stores, search indexes, file systems, and Kafka brokers. kafka connect 是一个框架,用来帮助集成其他系统的数据到kafka…...
嵌入式培训之数据结构学习(三)gdb调试、单向链表练习、顺序表与链表对比
目录 一、gdb调试 (一)一般调试步骤与命令 (二)找段错误(无下断点的地方) (三)调试命令 二、单向链表练习 1、查找链表的中间结点(用快慢指针) 2、找出…...
MySQL——九、锁
分类 全局锁表级锁行级锁 全局锁 做全库的逻辑备份 flush tables with read lock; unlock tables;在InnoDB引擎中,我们可以在备份时加上参数–single-transaction参数来完成不加锁的一致性数据备份 mysqldump --single-transaction -uroot -p123456 itcast>…...
精益数据分析(57/126):创业移情阶段的核心要点与实践方法
精益数据分析(57/126):创业移情阶段的核心要点与实践方法 在创业的浩瀚征程中,每一个阶段都承载着独特的使命与挑战。今天,我们继续秉持共同进步的理念,深入研读《精益数据分析》,聚焦创业的首…...
服务器被打了怎么应对
云服务器遭受攻击该如何应对? 在互联网时代,不少使用云服务器的网络工作者常常会面临网络攻击的威胁。若云服务器未配置完善的防火墙,极易引发服务器宕机,甚至被封禁隔离(俗称“陷入黑洞”),进…...
Halcon案例(二):C#联合Halcon回形针以及方向
本案例分3部分 识别效果,分别显示识别前后识别后;代码展示,分别是Halcon源码和Halcon转为C#的代码代码解释(解释在源码中); 原图如下 识别后图像: 其中计算回形针与X轴之间的夹角 Halcon代码: * clip.hdev: Orientation of clips *识别图像中的回形针,并且计算回形针与X轴之间…...
Spyglass:跨时钟域同步(同步单元)
相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 简介 同步单元方案可以用于控制/数据信号跨时钟域同步,该方案使用约束或参数将目标时钟域中单元指定为同步单元,如图1所示。 图1 同步单元方案…...
JAVA异常体系
在 Java 里,异常体系是其错误处理机制的核心内容,它能够帮助开发者有效应对程序运行时出现的各种意外状况。 异常体系的基本架构 它主要包含两个重要分支: Error(错误):这类异常是程序自身无法处理的严重…...
Milvus 视角看主流嵌入式模型(Embeddings)
嵌入是一种机器学习概念,用于将数据映射到高维空间,其中语义相似的数据被紧密排列在一起。嵌入模型通常是 BERT 或其他 Transformer 系列的深度神经网络,它能够有效地用一系列数字(称为向量)来表示文本、图像和其他数据…...
全面解析 Server-Sent Events(SSE)协议:从大模型流式输出到实时通信场景
全面解析 Server-Sent Events(SSE)协议:从大模型流式输出到实时通信场景 一、SSE 协议概述 Server-Sent Events(SSE) 是 HTML5 标准中定义的一种基于 HTTP 的服务器向客户端单向推送实时数据的协议。其核心特性包括&a…...
数据库系统概论|第七章:数据库设计—课程笔记
前言 本章讨论数据库设计的技术和方法,主要讨论基于关系数据库管理系统的关系数据库设计问题,而关于数据库的设计过程中,关于数据模型、关系模型等基本概念在前文中已经有详尽介绍,此处便不再赘述,本文主要围绕概念结…...
Java项目拷打(外卖+点评)
一、点评星球(黑马点评) 1、项目概述 1.1、项目简介 本项目是基于Spring Boot与Redis深度整合的前后端分离的点评平台。系统以Redis为核心技术支撑,重点解决高并发场景下的缓存穿透、击穿、雪崩等问题,涵盖商户展示、优惠券秒杀…...
MCP:开启AI的“万物互联”时代
MCP:开启AI的“万物互联”时代 ——从协议标准到生态革命的技术跃迁 引言:AI的“最后一公里”困境 在2025年的AI技术浪潮中,大模型已从参数竞赛转向应用落地之争。尽管模型能生成流畅的对话、创作诗歌甚至编写代码,但用户逐渐发现…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-D. 扩展插件列表(PostGIS/PostgREST等)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 附录D. PostgreSQL扩展插件速查表一、插件分类速查表二、核心插件详解三、安装与配置指南四、应用场景模板五、版本兼容性说明六、维护与优化建议七、官方资源与工具八、附录…...
Spring Boot拦截器详解:原理、实现与应用场景
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、拦截器概述 拦截器(Interceptor)是Spring MVC框架中用于对请求进行预处理和后处理的组件,主要作用于Controller层。相…...
万字解析:Java字符串
目录 一、 String类 1. String类的初始化 1.1 常用的三种构造String类的方式 1.2 String类如何存储字符串? 2. String类的常用功能方法 2.0 字符串长度的获取 2.1 String对象的比较 2.2 字符/字符串的查找 2.3 字符串的转化 2.4 字符 / 字符串的替换 2.5…...
0514得物、0509滴滴面试总结复盘
目前最欠缺的还是,编码不是很熟,很多都遇到过但是就是写不出来,或者靠背先写一点,然后去加,加的过程没考虑逻辑是不是对的,用滴滴面试官的一句话,就是多刷多练多编码! 第二块就是项目…...
记录算法笔记(20025.5.14)对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 提示: 树中节点数目…...
AI大模型从0到1记录学习 linux day23
第 1 章 MySQL概述 1.1 基本概念 1.1.1 数据库是什么? 数据库(DB:Database):存储数据的地方。 1.1.2 为什么要用数据库? 应用程序产生的数据是在内存中的,如果程序退出或者是断电了,…...
用git下载vcpkg时出现Connection was reset时的处理
用git安装vcpkg时出现Connect was rest(如上图)。多谢这位网友的博文解决了问题: 通过:http.sslVerify false全局来设置,执行以下命令: git config --global http.sslVerify "false" 原文链接:…...
【数据库复习】SQL语言
一、SQL通用语法与分类 (一)SQL通用语法 SQL语句的格式通常较为规范,以关键字开头,如CREATE、SELECT、INSERT等,后跟具体的表名、字段名和条件等。在MySQL中,还可以使用help命令获取帮助信息,…...
二叉树——层序遍历
目录 实现层序遍历 判断是否为完全二叉树 实现层序遍历 除了先序遍历,中序遍历,后序遍历外,还可以对二叉树进行层序遍历。设二叉树的结点所在层数为1,层序遍历就是从所在二叉树的根结点出发,首先访问第一层的树根结点…...
Seata源码—2.seata-samples项目介绍
大纲 1.seata-samples的配置文件和启动类 2.seata-samples业务服务启动时的核心工作 3.seata-samples库存服务的连接池配置 4.Seata对数据库连接池代理配置的分析 5.Dubbo RPC通信过程中传递全局事务XID 6.Seata跟Dubbo整合的Filter(基于SPI机制) 7.seata-samples的AT事…...
企业数字化转型背景下的企业知识管理挑战与经验杂谈
一、引言 在数字化转型的浪潮下,企业知识管理正面临前所未有的挑战。随着数据量的急剧增长,企业内部积累的信息呈现出碎片化、分散化的趋势,传统的知识管理体系已难以有效应对这一变革。首先,信息碎片化问题日益严重,…...
第二章:磁盘管理与文件管理
一、磁盘管理 1.windows和Linux磁盘管理的区别 windows资源管理方式 系统一般安装在C盘 C盘下的"Windows"目录是操作系统的核心 C盘下的"Program Files"目录下安装软件 C盘下的"用户"目录是所有的用户,包括超级管理员也在其中 …...
Java版OA管理系统源码 手机版OA系统源码
Java版OA管理系统源码 手机版OA系统源码 一:OA系统的主要优势 1. 提升效率 减少纸质流程和重复性工作,自动化处理常规事务,缩短响应时间。 2. 降低成本 节省纸张、打印、通讯及人力成本,优化资源分配。 3. 规范管理 固化企…...
springboot踩坑记录
之前运行好端端的项目,今天下午打开只是添加了一个文件之后 再运行都报Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver class Action: Conside…...
SpringAI
机器学习: 定义:人工智能的子领域,通过数据驱动的方法让计算机学习规律,进行预测或决策。 核心方法: 监督学习(如线性回归、SVM)。 无监督学习(如聚类、降维)。 强化学…...
acwing 1488. 最短距离 超级源点 最短路 堆优化Dijkstra
经验总结 邻接表 节点1连接到节点2,权重为3。 节点1连接到节点3,权重为5。 节点2连接到节点4,权重为2。 g[1] {{2, 3}, {3, 5}} g[2] {{1, 3}, {4, 2}} g[3] {{1, 5}} g[4] {{2, 2}} vector<vector<PII>> g;题目背景 有 N…...
2002-2024年地级市新质生产力词频统计数据(46个关键词词频)
2002-2024年地级市新质生产力词频统计数据(46个关键词词频) 1、时间:2002-2024年 2、来源:ZF工作报告 3、指标:行政区划代码、年份、地区、所属省份、文本总长度、仅中英文-文本总长度、文本总词频-全模式、文本总词…...
院校机试刷题第二天:1479 01字符串、1701非素数个数
一、1479 01字符串 1.题目描述 2.解题思路 方法一:暴力法 模拟过程,列出几个数据来a[1]1, a[2]2, a[3]3, a[4]5以此类推,这就是斐波那契数列,每一项都等于前两项之和,确定好a[1], a[2]即可。 方法二:动…...
2011-2019年各省总抚养比数据
2011-2019年各省总抚养比数据 1、时间:2011-2019年 2、来源:国家统计局 3、指标:行政区划代码、地区、年份、总抚养比(人口抽样调查)(%) 4、范围:31省 5、指标解释:总抚养比也称总负担系数。指人口总体中非劳动年…...
3337|3335. 字符串转换后的长度 I(||)
1.字符串转换后的长度 I 1.1题目 3335. 字符串转换后的长度 I - 力扣(LeetCode) 1.2解析 递推法解析 思路框架 我们可以通过定义状态变量来追踪每次转换后各字符的数量变化。具体地,定义状态函数 f(i,c) 表示经过 i 次转换后࿰…...
【电路笔记 通信】8B/10B编码 高速数据传输的串行数据编码技术 论文第三部分 The 8B/10B coding map
0810逻辑总览 The 8B/10B coding map 图 1 展示了一个通信适配器接口,它由八条数据线 A、B、C、D、E、F、G、H(注意:使用大写字母表示)、一条控制线 K,以及一条以字节速率运行的时钟线 BYTECLK 组成。控制线 K 用于指…...
智能化双语LaTeX系统,分阶段系统性开发技术实现路径:目标是实现语义级编译和认知增强写作,推动跨文明知识表达
智能化双语LaTeX系统,分阶段系统性开发技术实现路径(D认为W可辅助各环节开发): 第一阶段:双语LaTeX引擎升级 1. 核心架构设计 Unicode深度支持 开发新一代XeLaTeX/LuaLaTeX内核 原生支持UTF-8编码(如汉…...
【RabbitMQ】路由模式和通配符模式的具体实现
文章目录 路由模式创建队列和交换机生产者代码创建交换机声明队列绑定交换机和队列发送消息完整代码 消费者代码运行程序启动生产者启动消费者 通配符模式创建队列和交换机生产者代码创建交换机声明队列绑定交换机和队列发送消息完整代码 消费者代码运行程序启动生产者启动消费…...
【测试开发知识储备】之Jacoco(Java Code Coverage)
文章目录 Jacoco是什么Jacoco的主要功能(一)多样化覆盖率指标分析(二) 丰富的报告生成(三)实时数据收集 Jacoco的工作原理(一)字节码增强(二)测试执行与数据收…...
大二java第一面小厂(挂)
第一场: mybatis怎么防止数据转义。 Hutool用的那些你常用的方法。 springboot的常用注解。 redis的多级缓存。 websocket怎么实现的多人协作编辑功能。 怎么实现的分库分表。 mysql里面的各种操作,比如说分表怎么分,分页查询怎么用。 mybat…...
Postman接口测试
现在企业级测试分为三层测试 UI层:即与用户交互的层面 Service层:比如前后端分离的系统,测试数据的传输 Unit层:单元测试 接口 接口的概念很抽象,比如我们经常使用的USB接口,Lighting接口等传输电量数据…...
试除法判断素数优化【C语言】
代码引用 int is_prime(int num) {if (num < 1) return 0;if (num 2 || num 3) return 1;if (num % 2 0 || num % 3 0) return 0;for (int i 5; i * i < num; i 6) {if (num % i 0 || num % (i 2) 0) return 0;}return 1; } 一、数学原理 所有大于3的素数都可…...
全新开发-iVX图形化编程VS完整IDE
本文针对传统软件开发的效率与可控性矛盾,系统阐释 iVX"图形化编程 全栈 IDE" 的复合架构如何突破行业瓶颈。通过 "可视化建模 - 标准代码生成 - 独立运行" 的技术闭环,iVX 实现开发效率提升 60% 与源码完全可控的双重目标。研究揭…...
前端表格滑动滚动条太费事,做个浮动滑动插件
比如下面的表格,因为滚动条样式设计得很窄,所以用鼠标滑动起来很费劲 <template><el-table:data"tableData"style"width: 600px"height"250"><el-table-columnfixedprop"date"label"日期&…...
基于自校准分数的扩散模型在并行磁共振成像中联合进行线圈灵敏度校正和运动校正|文献速递-深度学习医疗AI最新文献
Title 题目 Joint coil sensitivity and motion correction in parallel MRI with aself-calibrating score-based diffusion model 基于自校准分数的扩散模型在并行磁共振成像中联合进行线圈灵敏度校正和运动校正 01 文献速递介绍 磁共振成像(MRI)…...
【CUDA】Sgemm单精度矩阵乘法(上)
目录 前言1. 简述2. 框架搭建和CPU串行实现3. baseline算法:global memory4. 优化技巧1:shared memory5. 优化技巧2:shared memory sliding window6. 优化技巧3:增加每个线程的工作量7. 优化技巧4:使用float4提高读取…...
Linux proc文件系统 内存影射
文章目录 常见的内存分配函数/proc/pid/ 目录解析 用户进程的内存空间分配算法mmap 分配大内存可能不在堆中换为 malloc 现象相同 常见的内存分配函数 malloc / calloc / realloc(来自 C 标准库) void *malloc(size_t size):分配 size 字节…...
服务器时间发生跳变导致hghac中对应主机状态频繁切换为crash或stop
文章目录 环境症状问题原因解决方案相关文档报错编码 环境 系统平台:N/A 版本:N/A 症状 集群状态: [rootbthbj-hgywsjkjq-ip28-cen76 ~]# hghactl list Cluster: highgo-ee-cluster —---------------------—---------- | Member | Ho…...