【Java多线程】synchronized和ReentrantLock的区别

Java多线程中,synchronized和ReentrantLock的区别是什么?及使用场景有哪些? 如果项目中的同步需求相对简单,synchronized是一个不错的选择,因为它简单易用且能自动管理锁的获取和释放。而如果需要更复杂的同步控制,比如需要响应中断或实现公平锁,ReentrantLock则更为合适。在实际开发中,应根据具体需求和场景选择合适的同步机制。 阅读详情

可重入性:

  首先说明可重入锁的概念,即一个线程尝试去获取自己已经持有的锁,可以成功获取,而其他线程不可以获取。这样做的优点简而言之是——递归无阻塞的同步机制。若锁不是可重入的,在子类的同步方法中调用父类的同步方法,会无法第二次获取子对象的锁,导致死锁。
  从名字上理解,ReentrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。

锁的实现:

  synchronized是依赖于JVM实现的,而ReentrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用户自己敲代码实现的区别。前者的实现是比较难见到的,后者有直接的源码可供阅读。

性能的区别:

  在synchronized优化以前,synchronized的性能是比ReentrantLock差很多的,但是自从synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReentrantLock中的CAS技术。都是试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞。

功能的区别:

  便利性:synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReentrantLock需要手动来加锁和释放锁,为了避免代码异常没有执行unlock()方法而造成死锁,开发中必须在finally中声明释放锁。

  锁的细粒度和灵活度:很明显是ReentrantLock优于synchronized

ReentrantLock独有的能力:

  1.  ReentrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。
    
  2.  ReentrantLock提供了一个Condition(条件)类,用来实现分组唤醒需要唤醒的线程们,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。
    
  3.  ReentrantLock提供了一种能够中断等待锁的线程的机制,通过lock.lockInterruptibly()来实现这个机制。
    

ReentrantLock实现的原理:
  简单来说,ReentrantLock的实现是一种自旋锁,通过循环调用CAS操作来实现加锁。它的性能比较好也是因为避免了使线程进入内核态的阻塞状态。想尽办法避免线程进入内核的阻塞状态是我们去分析和理解锁设计的关键钥匙。

ReentrantLock的使用场景:
  当你需要使用ReentrantLock的三个独有功能时。

Java多线程系列--Synchronized和ReentrantLock区别(1) 什么是ActiveMQ?ActiveMQ服务器宕机怎么办?丢消息怎么办?持久化消息非常慢怎么办?消息的不均匀消费怎么办?死信队列怎么办?ActiveMQ中的消息重发时间间隔和重发次数吗? 阅读详情

相关推荐

STM32硬件SPI驱动W5500以太网模块全流程(附避坑指南)

本文详细介绍了如何使用STM32硬件SPI驱动W5500以太网模块,包括开发环境准备、SPI接口配置、网络参数设置及常见问题排查。通过官方驱动移植和实战案例,帮助开发者快速实现以太网通信功能,适用于智能家居、工业控制等物联网应用场景。

weixin_29192141的博客 364

ReentrantLock与synchronized的区别

ReentrantLock与synchronized的区别

qq_62283164的博客 6741

DBSCAN聚类算法——机器学习(理论+图解+python代码)

一、前言 二、DBSCAN聚类算法 三、参数选择 四、DBSCAN算法迭代可视化展示 五、常用的评估方法:轮廓系数 六、用Python实现DBSCAN聚类算法 一、前言 去年学聚类算法的R语言的时候,有层次聚类、系统聚类、K-means聚类、K中心聚类,最后呢,被DBSCAN聚类算法迷上了,为什么呢,首先它可以发现任何形状的簇,其次我认为它的理论也是比较简单易懂的。今年在python...

huacha__的博客 20万+

synchronized和ReentrantLock的5个区别!

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在 Java 中,常用的锁有两种:synchronized(内置锁)和 ReentrantLock(可重入锁),二者的功效都是相同得,但又有很多不同点,所以我们今天就来聊聊。区别1:用法不同synchronized 可用来修饰普通方法、静态方法和代码块...

磊哥聊Java 1万+

【寄存器模型】一、一个简单的寄存器模型

在描述寄存器模型之前,首先来了解一下实际寄存器的组成结构:如下图所示的DUT内部真实的寄存器寄存器中最小的一个单位是域(field),域是由一个或多个bit拼接而成的。一个或多个域就构成了一个寄存器(reg)。一个或多个寄存器就构成了一个块(block)。将DUT中的寄存器抽象出来,建立寄存器模型,如下图所示:uvm library已经定义好了field、reg、block等相关的概念,构建寄存器模型时,只需要继承这些类即可。:构建寄存器模型中的域段。uvm_reg。...

carrotbanana的博客 5368

kubedns-coredns部署pod出现not ready问题

文章目录遇到的问题1、发现问题2、排查问题3、解决方法 coredns的实例health_check不通过的问题,排查和解决方法 遇到的问题 1、发现问题 pod启动但是未ready 查看是readiness失败 使用对应的URL进行curl,发现真的返回503 2、排查问题 查看错误日志,发现一堆这个错误"waiting on : kubernetes" 网上相关的问题解答 这个跟测试场景不一样,这个案例是开了防火墙,可以确认我这个案例的机器没有开防火墙,但它提醒了一点,coredns是需要访问ap

u012533481的博客 2844

Synchronized和ReentrantLock的区别

1.Synchronized和ReentrantLock的区别 ​ ①ReentrantLock显示地获得,释放锁,synchronized隐式获得释放锁 ​ ②ReentrantLock可响应中断,可轮回,synchronized是不可以响应中断的 ​ ③ReentrantLock是API级别的,synchronized是JVM级别的 ​ ④ReentrantLock可以实现公平锁 ​ ⑤ReentrantLock通过Condition可以绑定多个条件 ​ ⑥底层实现不一样,synchronized是同步

qq_19667981的博客 2万+

FreeRtos——10、全局看门狗设计

RTOS 里的看门狗不只是为了证明 CPU 还在动,而是为了证明每个业务逻辑都在按预期的节奏“呼吸”。

qq_40170041的博客 900

Synchronized和 ReentrantLock有什么区别?

Synchronized和 ReentrantLock有什么区别?

水w的博客 2571

别再对着数据手册发愁了!用HFSS 2023 R2搞定ESP32-C3板载天线的阻抗匹配

本文详细介绍了如何利用HFSS 2023 R2进行ESP32-C3板载天线的阻抗匹配优化,解决实际PCB设计中常见的性能偏差问题。通过智能模型导入、科学参数扫描和量化优化流程,显著提升天线性能,适用于WIFI和蓝牙应用场景。

weixin_42523543的博客 448

STM32 USB键盘实现指南

在STM32上实现键盘功能可以通过USB HID(人机接口设备)协议来实现,使STM32设备能被计算机识别为标准键盘。通过上述步骤,您可以在STM32上实现一个功能完整的USB键盘。关键点包括:正确配置USB HID设备实现键盘矩阵扫描处理按键事件并生成HID报告优化按键响应和消抖处理添加额外功能如宏键和LED反馈这个实现可以作为基础,进一步扩展为游戏键盘、宏键盘或特殊输入设备。

suny8的专栏 969

Synchronized 与 ReentrantLock 的区别

工作中我们经常会遇到 Java 常见的加锁方法,本文着重介绍最常见的 synchronized 与 ReentrantLock 的区别,以及说明在动态高并发时为什么推荐 ReentrantLock 而不是 Synchronized? 一 Synchronized 与 ReentrantLock 的区别 1.1 底层实现的区别 底层实现上来说,synchronized 是 JVM 层面的锁,是 Java 关键字,通过 monitor 对象来完成(monitorenter 与 monitorexit),对象只有

liuwg1226的专栏 9081

Mac 下 OpenClaw 安装全记录:从零到一的保姆级图文教程

本文主要介绍了Mac 下 OpenClaw 安装全记录:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 安装教程 2.1 安装OpenClaw 2.2 配置模型 2.3 对话 3. 后续使用步骤 4. 关闭程序

weixin_43178406的博客 11万+

Java多线程系列--Synchronized和ReentrantLock区别

叙述java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock。Synchronize和ReentrantLock。

2401_89790716的博客 780

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java多线程八股(二),CAS详解,ReentrantLock和Synchronized的区别

因为Callable只定义了一个带有返回类型的任务,并没有真正执行 ,还需要搭配futureTask和Thread对象使用。CAS: 全称Compare and swap,字⾯意思:”比较并交换“,⼀个 CAS 涉及到以下操作。ABA 问题,某个线程把内存的值修改为A,另一个线程把内存的值修改为B,又修改成原来的A。(站在值科学的角度,最后为A,说明没有被其他线程修改过,实则不然只是被多修改了而已)Synchronized是通过代码块控制加锁解锁,包, 里面的类都是基于这种方式来实现的.

robin_suli的博客 1585

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java多线程——synchronized和ReentrantLock的区别

两者的共同点 都是用来协调多线程对共享对象、变量的访问 都是可重入锁,同一线程可以多次获得同一个锁 都保证了可见性和互斥性 两者的不同点 ReentrantLock显式的获得、释放锁,synchronized隐式获得释放锁 ReentrantLock 可响应中断、可轮回,synchronized 是不可以响应中断的,为处理锁的 不可用性提供了更高的灵活性 ReentrantLock是API级...

weixin_43980559的博客 274

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Java】【多线程】Synchronized 和 ReentrantLock的联系与区别

转载:https://blog.youkuaiyun.com/u011202334/article/details/73188404 1、synchronized的局限性    synchronized是java内置的关键字,它提供了一种独占的加锁方式。synchronized的获取和释放锁由JVM实现,用户不需要显示的释放锁,非常方便。然而synchronized也有一定的局限性,例如:当线程尝试获取锁的时...

love_Aym的博客 358

Java多线程中,synchronized和ReentrantLock的区别是什么?

ReentrantLock提供了更多的功能,比如可以中断等待锁的线程,获取等待锁的线程列表,还可以尝试获取锁。在JDK1.6之后,synchronized的性能得到了很大优化,和ReentrantLock比较接近。synchronized是依赖于JVM实现的,而ReentrantLock是Java提供的API。ReentrantLock可以指定为公平锁或非公平锁,而synchronized只能是非公平锁。ReentrantLock可以更精确的控制锁,有更丰富的锁操作方法。

weixin_44099583的博客 626

Java多线程:synchronized 和 ReentrantLock 区别是什么?

可重入锁:重入锁,也叫做递归锁,可重入锁指的是在一个线程中可以多次获取同一把锁,比如: 一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁, 两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。相比synchronized,ReentrantLock增加了一些高级功能。主要来说主要有三点:①等待可中断;③可实现选择性通知(锁可以绑定多个条件)

JSANXWT的博客 170

Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?

在Java中,多线程同步是确保线程安全的重要手段。和是两种常用的同步机制,它们各有优缺点,适用于不同的场景。本文将详细解释关键字和的区别,并探讨为什么我们有时会选择使用而不是。

杰哥在此的专栏 993
上一篇: 【maven】maven中的properties标签
下一篇: 【Python】python脚本实例
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值