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

synchronized与Lock深度对比

Java并发编程:synchronized与Lock深度对比

  1. 基本概念

1.1 synchronized
synchronized是Java内置的关键字,属于JVM层面的锁机制。它通过对象监视器(Monitor)实现同步,具有自动获取和释放锁的特性。

// 同步方法
public synchronized void syncMethod() {// 代码
}// 同步代码块
public void method() {synchronized(this) {// 代码}
}

1.2 Lock
Lock是Java并发包(java.util.concurrent.locks)提供的接口,属于API层面的锁机制。最常用的实现类是ReentrantLock

private Lock lock = new ReentrantLock();public void method() {lock.lock();try {// 代码} finally {lock.unlock(); // 必须手动释放}
}
  1. 核心区别对比
特性synchronizedLock (ReentrantLock)
实现方式JVM内置关键字Java类库实现
锁获取/释放自动手动(lock()/unlock())
锁类型非公平锁可配置公平/非公平锁
可中断性不可中断支持(lockInterruptibly())
尝试获取锁不支持支持(tryLock())
超时机制不支持支持(tryLock(time, unit))
条件变量单一条件(wait/notify)多条件(newCondition())
性能JDK6后优化,低竞争时性能好高竞争时性能更优
锁粒度方法或代码块级别可更细粒度控制
  1. 底层原理

3.1 synchronized实现
• 锁升级机制:偏向锁→轻量级锁→重量级锁

• 对象头Mark Word存储锁状态

• Monitor机制:每个对象关联一个Monitor,包含_EntryList和_WaitSet

3.2 Lock实现
• 基于AQS(AbstractQueuedSynchronizer)框架

• 使用CLH队列管理等待线程

• 支持公平/非公平两种获取锁方式

  1. 高级特性

4.1 Lock特有功能

// 1. 尝试获取锁
if (lock.tryLock()) {try {// 获取锁成功} finally {lock.unlock();}
}// 2. 可中断获取锁
try {lock.lockInterruptibly();// ...
} catch (InterruptedException e) {// 处理中断
}// 3. 多条件变量
Condition notFull = lock.newCondition();
Condition notEmpty = lock.newCondition();

4.2 synchronized优化
• 锁消除:JVM检测到不可能存在共享数据竞争时消除锁

• 锁粗化:将连续的同步块合并为一个更大的同步块

• 自适应自旋:根据历史数据动态调整自旋次数

  1. 使用场景建议

优先使用synchronized
• 简单的同步需求

• 锁的获取和释放在同一方法内

• 不需要高级功能(如超时、中断等)

选择Lock的情况
• 需要公平锁

• 需要尝试非阻塞获取锁

• 需要多个条件变量

• 锁需要在多个方法间传递

• 高竞争环境下对性能有更高要求

  1. 实际案例

6.1 生产者-消费者模型(Lock实现)

class Buffer {private final Lock lock = new ReentrantLock();private final Condition notFull = lock.newCondition();private final Condition notEmpty = lock.newCondition();public void produce() {lock.lock();try {while (isFull()) {notFull.await();}// 生产...notEmpty.signal();} finally {lock.unlock();}}
}

6.2 单例模式(synchronized实现)

class Singleton {private static volatile Singleton instance;public static Singleton getInstance() {if (instance == null) {synchronized(Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
  1. 总结

synchronizedLock都是Java中实现线程同步的有效机制,各有优缺点。理解它们的底层原理和适用场景,才能在实际开发中做出合理选择。对于大多数简单场景,synchronized已经足够;当需要更灵活的锁控制时,Lock是更好的选择。

相关文章:

synchronized与Lock深度对比

Java并发编程:synchronized与Lock深度对比 基本概念 1.1 synchronized synchronized是Java内置的关键字,属于JVM层面的锁机制。它通过对象监视器(Monitor)实现同步,具有自动获取和释放锁的特性。 // 同步方法 public synchronized void sy…...

LeetCode —— 94. 二叉树的中序遍历

94. 二叉树的中序遍历 题目:94. 二叉树的中序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) :…...

【无标题】四色拓扑收缩模型中环形套嵌结构的颜色保真确定方法

#### **1. 环形嵌套结构的局部保真机制** - **零点虚边与环形嵌套**:在顶点 \( v \) 处引入环形嵌套结构(如环面 \( T^2 \)),通过虚边连接形成闭合路径。该结构作为“颜色记忆单元”,存储相邻区域的色彩信息&#xff0…...

Curl 全面使用指南

Curl(Client URL)是一个跨平台命令行工具,支持多种协议(HTTP/HTTPS/FTP/SFTP等),用于数据传输、API调试、文件上传/下载等场景。以下从 核心功能、用户疑问解答、高级技巧 三方面系统总结,并整合…...

vscode 的空格和 tab 设置 与 Rime 自建词库

自动保存(多用于失去焦点时保存) Files: Auto Save 推荐不勾 保存时格式化(Pritter 插件的功能,自动使用 Pritter 的格式) Editor: Format On Save 推荐不勾 tab 的空格数量,2 或 4 Editor: Tab Size 推荐…...

Spark-小练试刀

任务1:HDFS上有三份文件,分别为student.txt(学生信息表)result_bigdata.txt(大数据基础成绩表), result_math.txt(数学成绩表)。 加载student.txt为名称为student的RDD…...

Python爬虫实战:获取jd商城最新5060ti 16g显卡销量排行榜商品数据并做分析,为显卡选购做参考

一、引言 1.1 研究目的 本研究旨在利用 Python 爬虫技术,从京东商城获取 “5060ti 16g” 型号显卡的商品数据,并对这些数据进行深入分析。具体目标包括: 实现京东商城的模拟登录,突破登录验证机制,获取登录后的访问权限。高效稳定地爬取按销量排名前 20 的 “5060ti 16g…...

【Vue bug】:deep()失效

vue 组件中使用了 element-plus 组件 <template><el-dialog:model-value"visible":title"title":width"width px":before-close"onClose"><div class"container" :style"{height:height px}"&g…...

基于数字图像处理的裂缝检测与识别系统(Matlab)

【优化】Matlab裂缝检测与识别系统 基于数字图像处理的裂缝检测与识别系统&#xff08;Matlab&#xff09; &#xff08;基本常在线秒回&#xff0c;有兴趣可以随时联系博主&#xff09; 系统主要的内容包括&#xff1a; 1.图像加载与初始化 选择图像文件并加载&#xff1a;…...

day12:遗传算法及常见优化算法分享

遗传算法这些常见优化算法简直是 “宝藏素材”&#xff01;用好了&#xff0c;轻轻松松就能填满论文一整节内容&#xff1b;要是研究透彻&#xff0c;甚至能独立撑起一整个章节。今天不打算深入展开&#xff0c;有个基础认知就行。等之后写论文真要用到这些算法了&#xff0c;咱…...

【计算机视觉】语义分割:MMSegmentation:OpenMMLab开源语义分割框架实战指南

深度解析MMSegmentation&#xff1a;OpenMMLab开源语义分割框架实战指南 技术架构与设计哲学系统架构概览核心技术特性 环境配置与安装指南硬件配置建议详细安装步骤环境验证 实战全流程解析1. 数据集准备2. 配置文件定制3. 模型训练与优化4. 模型评估与推理 核心功能扩展1. 自…...

25_04_30Linux架构篇、第1章_02源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62

Linux_基础篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.01 适用环境: Centos7 文档说明 本文…...

【重走C++学习之路】25、特殊类设计

目录 一、不能被拷贝的类 二、堆上创建对象的类 三、栈上创建对象的类 四、不能被继承的类 五、单例模式 结语 一、不能被拷贝的类 如何实现一个不能被拷贝的类&#xff1f;在看到这个要求的第一反应就是禁掉类的拷贝构造函数和赋值运算符重载函数&#xff0c;再往深了探…...

基于Redis实现-用户签到

基于Redis实现-用户签到 这个功能将使用到Redis中的BitMap来实现。 我们按照月来统计用户签到信息&#xff0c;签到记录为1&#xff0c;未签到则记录为0 把每一个bit位对应当月的每一天&#xff0c;形成了映射关系。用0和1标示业务状态&#xff0c;这种思路称为位图(BitMap)。…...

利用Redisson分布式锁解决多服务器数据刷新问题

利用Redisson分布式锁解决多服务器数据刷新问题 一、业务背景二、代码实现1、引入Redisson依赖2、配置Redisson&#xff0c;实际项目中Redis为集群配置3、自定义拒绝策略4、异步刷新网元服务 三、项目结构及源码 一、业务背景 最近有个需求需要自动刷新网元服务&#xff0c;由…...

25.4.30数据结构|并查集 路径压缩

前言 在QuickUnion快速合并的过程中&#xff0c;每次都要找根ID&#xff0c;而路径压缩让找根ID变得更加迅速直接。 路径压缩 针对的是findRootIndex()【查找根ID】进行的压缩。 需要实现的是&#xff1a; 在找根节点的过程中&#xff0c;记录这条路径上的所有信息&#xff0c;…...

react学习笔记3——基于React脚手架

React路由 相关理解 SPA的理解 单页Web应用&#xff08;single page web application&#xff0c;SPA&#xff09;。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面&#xff0c;只会做页面的局部更新。数据都需要通过ajax请求获取, 并在前端异步展现。 路由的理…...

C#中的LINQ:简化数据查询与操作

引言 在现代软件开发中&#xff0c;处理和操作数据是不可避免的任务。无论是从数据库读取信息&#xff0c;还是对内存中的集合进行筛选、排序等操作&#xff0c;开发者都需要一种高效且易于使用的方法。C#中的LINQ&#xff08;Language Integrated Query&#xff09;正是为此而…...

OkHttp3.X 工具类封装:链式调用,支持HTTPS、重试、文件上传【内含常用设计模式设计示例】

OkHttp3.X 工具类封装&#xff1a;链式调用&#xff0c;支持HTTPS、重试、文件上传 基于OkHttp3.X封装&#xff0c;提供链式调用API&#xff0c;简化GET/POST请求&#xff0c;支持HTTPS、自动重试、文件上传等功能&#xff0c;提升开发效率。 在 Android 和 Java 开发中&#x…...

Unity SpriteEditor(精灵图片编辑器)

&#x1f3c6; 个人愚见&#xff0c;没事写写笔记 &#x1f3c6;《博客内容》&#xff1a;Unity3D开发内容 &#x1f3c6;&#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f50e;SpriteEditor&#xff1a; 精灵图片编辑器 &#x1f4cc;用于编辑2D游戏开发中使用的Sp…...

雅思写作--70个高频表达

文章目录 1. learn new skills学生通过户外活动学到很多新技2. take immediate action to do各国采取有效行动以保护环境政府采取了必要行动以减少失业。你应该立即采取行动来解3. communication skills4. grow significantly5. have many advantages1. learn new skills “lea…...

Anaconda中配置Pyspark的Spark开发环境

Anaconda中配置Pyspark的Spark开发环境 目录 1.在控制台中测试ipython是否启动正常2.安装好Java3.安装Spark并配置环境变量4.PySpark配置5.修改spark\conf下的spark-env文件6.测试Pyspark是否安装成功 1.在控制台中测试ipython是否启动正常 anaconda正常安装 这里先检查ipyt…...

Spring 提供了多种依赖注入的方式

构造器注入&#xff08;Constructor Injection&#xff09; 构造器注入是通过类的构造函数来注入依赖项。这是 Spring 推荐的方式&#xff0c;因为它提供了不可变性和更好的可测试性。 import org.springframework.stereotype.Component;Component public class ServiceA {pub…...

面经-计算机网络——OSI七层模型与TCP/IP四层模型的对比详解

OSI七层模型与TCP/IP四层模型的对比详解 一、图示解析&#xff1a;分层封装结构 你提供的图清晰展示了网络通信中从应用层到物理层的封装过程&#xff0c;每一层都会对上层的数据加上自己的头部信息&#xff08;Header&#xff09;&#xff1a; 应用层&#xff1a; 应用…...

网络安全知识问答微信小程序的设计与实现

网络安全知识问答微信小程序的设计与实现&#xff0c;说白了&#xff0c;就是搭建一款网络安全知识问答微信小程序&#xff0c;类似网络安全百科直通车。三步走。 需求沟通 进行需求沟通&#xff0c;此处省略1000字。 画草图 根据沟通的需求&#xff0c;进行整理&#xff0c…...

Canvas特效实例:黑客帝国-字母矩阵(字母雨)

黑客帝国-字幕矩阵&#xff08;字母雨&#xff09; 效果预览代码实现思路解析遗留问题 效果预览 话不多说&#xff0c;我们直接上效果&#xff1a;当页面加载完成&#xff0c;屏幕上会落下如瀑布般的绿色字母流&#xff0c;不断向下滑动&#xff0c;仿佛进入了黑客帝国的数字世…...

「Mac畅玩AIGC与多模态11」开发篇07 - 使用自定义名言插件开发智能体应用

一、概述 本篇介绍如何在 macOS 环境下,通过编写自定义 OpenAPI Schema,将无需认证的名言服务接入 Dify 平台,并开发基于外部公共数据的智能体应用。本案例继续实践 GET 请求型 API 的实际调用技巧。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已部署并可访问…...

快速上手非关系型数据库-MongoDB

简介 MongoDB 是一个基于文档的 NoSQL 数据库&#xff0c;由 MongoDB Inc. 开发。 NoSQL&#xff0c;指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写&#xff0c;是对不同于传统的关系型数据库的数据库管理系统的统称。 MongoDB 的设计理念是为了应对大数据量、…...

响应式布局,在飞帆平台中如此简单

这些控件都是可以自己动手去实现的。也可以将这些控件复制到自己名下进行修改。 响应式布局https://fvi.cn/782...

UN R79 关于车辆转向装置形式认证的统一规定(正文部分1)

UN R79法规是针对转向装置的型式认证法规&#xff0c;涉及A/B1/C类的横向控制辅助驾驶功能&#xff0c;对各功能的功能边界、性能要求、状态提示、故障警示以及型式认证要提交的信息做了规范&#xff0c;本文结合百度文心一言对法规进行翻译&#xff0c;并结合个人理解对部分内…...

深度学习系统学习系列【1】之基本知识

文章目录 说明基础知识人工智能、机器学习、深度学习的关系机器学习传统机器学习的缺陷选择深度学习的原因深度学习的关键问题深度学习的应用深度学习的加速硬件GPU环境搭建主流深度学习框架对比 说明 文章属于个人学习笔记内容&#xff0c;仅供学习和交流。内容参考深度学习原…...

python3GUI--视频监控管理平台 By:PyQt5(详细讲解)

文章目录 一&#xff0e;前言二&#xff0e;相关知识1.PyQt52.RTSP协议&#x1f4cc; 简介&#xff1a;&#x1f9e9; 特点&#xff1a;&#x1f4e1; 工作方式&#xff1a; 2. **RTMP&#xff08;Real-Time Messaging Protocol&#xff09;**&#x1f4cc; 简介&#xff1a;&a…...

第十一届蓝桥杯 2020 C/C++组 既约分数

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 既约分数 - 蓝桥云课 思路&a…...

如何让Steam下载速度解除封印?!

平时一直没注意到家里的路由器在偷懒。最近成功榨干家里的带宽&#xff0c;把平时一直20mb/s左右下载速度的路由器一番改造后成功steam下载速度稳定85Mb/s。平时一直都只发挥了他的1/3不到&#xff0c;真是太可惜了。 硬件 首先检查硬件&#xff0c;就千兆路由器而言&#xf…...

HOOK上瘾思维模型——AI与思维模型【88】

一、定义 HOOK上瘾思维模型是一种通过设计一系列的触发&#xff08;Trigger&#xff09;、行动&#xff08;Action&#xff09;、奖励&#xff08;Reward&#xff09;和投入&#xff08;Investment&#xff09;环节&#xff0c;来促使用户形成习惯并持续使用产品或服务的思维框…...

基于开源AI智能名片链动2+1模式S2B2C商城小程序的IP开发泡沫破局与价值重构研究

摘要&#xff1a;当前IP开发领域普遍存在"冒进式泡沫"现象&#xff0c;企业将初级IP包装为超级IP运营&#xff0c;导致资源错配与价值虚化。本文通过实证分析开源AI智能名片链动21模式S2B2C商城小程序的技术架构与商业逻辑&#xff0c;揭示其通过智能内容引擎、合规化…...

深⼊理解指针(8)

1.对上一篇的补充内容 typedef int* ptr_t #define PTR_T int* 这两种写法都是可以的 ptr_t p1, p2; //p1, p2 都是指针变量 PTR_T p3, p4; //p3 是指针变量, p4是整型变量 为什么p3 是指针变量, p4是整型变量呢&#xff1f; 因为PTR_T 真的被改为了 int* 在编译器中…...

【iview】icon样式

A. 工程中引入样式文件 iview源码工程中的example工程中如何引入iview样式 image.png 自定义工程中如何引入iview样式 一般在src/main.js中引入&#xff08;在index.html中也可以&#xff0c;当然app.vue中也可以&#xff09; import "iview/dist/styles/iview.css"B…...

【计算机视觉】三维视觉:Nerfstudio:模块化神经辐射场框架的技术突破与实战指南

深度解析Nerfstudio&#xff1a;模块化神经辐射场框架的技术突破与实战指南 技术架构与核心创新系统架构设计关键技术特性 环境配置与安装指南硬件要求全平台安装流程 实战全流程解析1. 数据采集与预处理2. 模型训练与优化3. 可视化与导出 核心技术深度解析1. 混合表示网络2. 渐…...

第二章 OpenCV篇-图像阈值的综合操作-Python

目录 一.图像阈值 二.图像平滑 1.均值滤波 2.方框滤波 3.高斯滤波 4.中值滤波 5.双边滤波 此章节主要讲解&#xff1a;图像阈值、图像平滑处理、均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波。 这里先讲作者使用matplotlib模块出现错误的解决方法。 首先作者在这…...

WPF处理大规模激光数据计算与安全传输处理

WPF大规模激光数据处理与安全传输系统设计方案 一、系统架构设计 1. 整体架构 ┌─────────────────────────────────────────────┐ │ WPF客户端应用 │ ├───────────────┬…...

vue 常见ui库对比(element、ant、antV等)

Element UI 1. 简介 Element UI 是一个基于 Vue 2 和 Vue 3 的企业级 UI 组件库&#xff0c;提供了丰富的组件和主题定制功能。官方网站&#xff1a;Element UI 2. 主要特点 丰富的组件&#xff1a;包括表单、表格、布局、导航、弹窗等多种组件。主题定制&#xff1a;支持主…...

【c++】【STL】stack详解

目录 stack类的作用什么是容器适配器stack的接口构造函数emptysizetoppushpopswap关系运算符重载 stack类的实现 stack类的作用 stack是stl库提供的一种容器适配器&#xff0c;也就是我们数据结构中学到的栈&#xff0c;是非常常用的数据结构&#xff0c;特点是遵循LIFO&#…...

单片机-89C51部分:12 pwm 呼吸灯 直流电机

飞书文档https://x509p6c8to.feishu.cn/wiki/JkzfwSoFBiUKc4kh8IoccTfyndg 一、什么是PWM&#xff1f; PWM是脉冲宽度调制的缩写&#xff0c;它是一种通过调整脉冲信号的高电平和低电平时间比例来控制电路输出的技术。简单来说&#xff0c;PWM是一种控制电子设备输出电压或电…...

WPF实现数据库操作与日志记录

1. 数据库操作实现 1.1 数据库连接基类 public abstract class DatabaseBase : IDisposable {protected string ConnectionString { get; }protected IDbConnection Connection { get; private set; }protected DatabaseBase(string connectionString){ConnectionString = co…...

用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案

Spring Boot 的 Fat JAR&#xff08;通过 spring-boot-maven-plugin 打包&#xff09;虽然简化了部署&#xff0c;但也存在一些潜在缺点&#xff0c;需根据场景权衡&#xff1a; 1. 启动速度较慢 原因&#xff1a; Fat JAR 需要在启动时解压并加载所有依赖的 JAR 文件到类路径…...

Spring Boot 使用 WebMagic 爬虫框架入门

1. 创建 Spring Boot 项目 使用 Spring Initializr 创建一个 Spring Boot 项目&#xff0c;选择需要的依赖&#xff0c;如 Spring Web 等。 2. 添加 WebMagic 依赖 在项目的 pom.xml 文件中添加 WebMagic 的核心和扩展依赖&#xff1a; <dependency><groupId>u…...

【软件设计师:复习】上午题核心知识点总结(二)

一、计算机网络(常考) 1.网络模型与协议(必考) 1.OSI七层模型 vs. TCP/IP四层模型 OSI七层TCP/IP四层核心协议/设备功能应用层(Application)应用层HTTP、FTP、DNS、SMTP提供用户接口和服务表示层(Presentation)SSL/TLS、JPEG、ASCII数据格式转换、加密/解密会话层(S…...

TensorRt10学习第一章

建立TensorRt时必须要有Public ILogger,因为createInferBuiler和createruntime要用&#xff0c;是一个接口 出错打印 和...

【LeetCode Hot100】回溯篇

前言 本文用于整理LeetCode Hot100中题目解答&#xff0c;因题目比较简单且更多是为了面试快速写出正确思路&#xff0c;只做简单题意解读和一句话题解方便记忆。但代码会全部给出&#xff0c;方便大家整理代码思路。 46. 全排列 一句话题意 给定一个无重复数字的序列&#xf…...