JAVA多线程高并发之ReentrantLock讲解lock/unlock/tryLock方法

ReentrantLock源码lock和tryLock区别 在reentrantLock中,提供了一个lock和一个tryLock方法,这两个方法是有区别的,这篇笔记主要记录下具体的区别信息 结论 其实对于这个两个方法,简单来说,tryLock()方法,返回的是一个boolean类型变量,返回true,表示加锁成功,返回false,表示加锁失败,但是这个方法是没有排队的功能的 lock()方法有两个功能:尝试加锁 + 排队;所以,lock方法如果加锁失败,会去排队,我们也可以简单的认为,lock = tryLock + 排队方法 lock()源码 lock在加锁的时 阅读详情

JAVA中多线程高并发场景下保证线程安全通常都会考虑加锁。但是在特殊场景下我们也可以采用java.util.concurrent包提供的线程安全的对象,避免加锁从而达到高效的目的。

但是,这些线程安全的对象仅仅指的是针对于原子性操作是线程安全的,如果多个方法同时调用无法保证线程安全,只能考虑加锁。这里我们举个列子:假设我们在多线程高并发场景下使用java.util.concurrent.ConcurrentLinkedQueue这个对象来获取队列中的元素,可以直接调用poll()方法,不用加锁也可以保证线程安全,假如我们在获取的时候需要先判断队列是否为空然后获取,也就是先调用isEmpty()方法、接着调用poll()方法,这种情况就无法保证线程安全,因为这里是两步操作,无法保证原子性。

ReentrantLock也是多线程并发时候加锁一种方式,通常会用来和synchronized做比较。我简单整理一下如下:

1、从使用方法角度对比

  1. ReentrantLock必须手动释放锁,synchronized不用考虑(发生异常自动释放锁)
  2. ReentrantLock可以尝试锁定 trylock
  3. ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做成响应
  4. ReentrantLock可以指定公平锁Lock lock = new ReentrantLock(true)

2、从性能角度对比

  1. JDK1.5以前synchronized性能略低于ReentrantLock,包含JDK1.5版本
  2. JDK1.5以后Java虚拟机对synchronized做了很多优化,增加了偏向锁、轻量级锁(多数情况下是自旋锁)、重量级锁等细节。性能和ReentrantLock差不多。

我们来分析ReentrantLock 手动加锁lock()、释放锁unlock()、尝试锁定tryLock()

package com.reentranlock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ReentrantLock讲解
 * lock()、unlock()、尝试锁定tryLock()
 *
 * @author 小辉哥/小辉GE
 * <p>
 * 2019年8月10日 下午15:30:00
 */
public class ReentrLock {
    Lock lock = new ReentrantLock();

    public void lock1() {
        try {
            lock.lock();
            System.out.println("lock1方法调用了");
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void lock2() {
        try {
            lock.lock();
            System.out.println("lock2方法调用了");
        } finally {
            lock.unlock();
        }
    }

    public void lock3() {
        boolean status = false;
        try {
            // status = lock.tryLock();
            try {
                status = lock.tryLock(2, TimeUnit.SECONDS);
                System.out.println("lock3方法尝试加锁,返回status为:" + status);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } finally {
            if (status)
                lock.unlock();
        }
    }

    public static void main(String[] args) {
        ReentrLock reentrLock = new ReentrLock();
        new Thread(reentrLock::lock1).start();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(reentrLock::lock2).start();
        //尝试加锁
        new Thread(reentrLock::lock3).start();

    }
}

测试输出结果如下:

结果分析:

1、从输出结果我们可以看出ReentrantLock手动加锁是需要释放的,一般与try/catch/finally一起使用,且在finally手动释放锁。

2、lock1方法、lock3方法调用完之后才执行lock2方法,也就是保证了多个线程获取锁只能等待其它已获得锁的线程执行完毕。

3、lock3方法可以不等到lock1方法执行完毕就调用,这句是tryLock作用,可以在另一个线程加锁的同时,尝试去加锁,能获取锁返回true,不能获取锁返回false。如果想让lock3可以获取锁,我们可以把tryLock等待时间调大一点即可。

以上代码仅供参考,如有不当之处,欢迎指出!!!

更多干货,欢迎大家关注和联系我。期待和大家一起更好的交流、探讨技术!!!

 

 

多线程系列(九) -ReentrantLock常用方法详解 在上一篇文章中,我们介绍了ReentrantLock类的一些基本用法,今天我们重点来介绍一下ReentrantLock其它的常用方法,以便对ReentrantLock类的使用有更深入的理解。 阅读详情

相关推荐

22. Java ReentrantLock 使用

本节内容主要是对 ReentrantLock 的使用进行讲解,之前对于 Lock 接口进行了讲解,ReentrantLock 是 Lock 接口的常用实现子类,占据着十分重要的地位。ReentrantLock 基本方法的使用,即 lock 与 unlock 方法的使用,这是最基础的方法使用,为重点内容;ReentrantLock lockInterruptibly 与 tryLock 方法的使用,也是经常使用到的方法,为本节重点内容;

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 1274

ReentrantLock里面lock和tryLock的区别

ReentrantLock ReentrantLock(轻量级锁)也可以叫对象锁,可重入锁,互斥锁。synchronized重量级锁,JDK前期的版本lock比synchronized更快,在JDK1.5之后synchronized引入了偏向锁,轻量级锁和重量级锁。以致两种锁性能旗鼓相当,看个人喜欢,本文主要介绍一下lock和tryLock的区别。 public void lock() { sync.lock(); } public void lockInterruptibly() thro

GracefulGuigui的博客 4945

ReentrantLock中tryLock()和lock()⽅法的区别

tryLock()表示尝试加锁,可能加到,也可能加不到,该⽅法不会阻塞线程,如果加到锁则返回true,没有加到则返回false。lock()表示阻塞加锁,线程会阻塞直到加到锁,⽅法也没有返回值。必须确保锁被获取的场景(如数据库事务、支付扣减)。的语义,但更灵活(可中断、可设置公平性)。:减少线程阻塞时间(如缓存更新、心跳检测)。:非关键任务、死锁预防(如分布式锁)。:如果锁被占用,可以立即回退或重试。如果锁被其他线程持有,当前线程会。:锁被占用时立即返回或超时放弃。:如果锁可用,则获取锁并返回。

完全体 1411

ReentrantLock的lock(), tryLock(), tryLock(long timeout, TimeUnit unit), lockInterruptibly() 及使用场景示例

一直在用concurrent包里的东西,最近想研究一下个中细节,先从ReentrantLock提供的集中获取锁的方式开始吧。 1.ReentrantLock简要介绍 简单介绍一下ReentrantLock,可重入锁,互斥锁,提供了fair和unfair两种模式的锁。默认构造函数是unfair的锁,如果初始化时传入true的参数则会返回fair锁。所谓不公平就是在锁可获取时,不用考虑该锁队列是否...

michaelgo的博客 2万+

【Java】Lock锁接口和实现类详解

文章目录1. Lock接口2. ReentrantLock类(重入锁/递归锁) - Lock接口实现类3. ReentrantReadWriteLock类(读写锁) - ReadWriteLock接口实现类 1. Lock接口 public interface Lock {} 提供更多实用性方法,功能更强大、性能更优越。 常用方法: ① void lock() // 获取锁,如锁被占用,则等待...

Hello, New World! 2100

Java的锁机制--Lock接口

synchronized关键字虽然可以解决大部分多线程锁的问题,但是仍旧存在下述问题: 假如持有锁的某线程因等待长时IO或者其他原因阻塞,其他等待的线程无法响应中断,只能不断等待; 多线程下只有读操作是不会发生冲突的,但synchronized关键字对读和写操作均一视同仁,所以当一个线程进行读取操作时,其他线程只能不断等待; 使用synchronized关键字无法确认线程是否成功获取到锁。 针...

打酱油的葫芦娃 6720

[Java] Lock(锁)的tryLock失败是否需要unlock?

因为锁是非常重要且占用资源的,所以基本上都知道需要解锁 常见的代码示例如下 没啥问题,但是如果用tryLock获取锁是否也是这样呢?如果没有获取到锁需要解锁么?如果未加锁解锁是不影响还是异常呢?正确的写法是怎样呢?其实实验的方法很简单,写个测试类实验一下就可以了 1、如果未加锁就解锁是不影响还是异常呢 结果: 会产生异常报错2、tryLock没有获取到锁需要解锁么?因为需要让它获取锁失败,所以我们利用多线程模拟下并发情况下,获取失败的效果。代码如下,看起来没啥问题 (实际上有问题 -,-) 结果 部分

weixin_41979605的博客 4764

双臂复合机器人眼在手外标定实战:从原理到D435标定流程详解

本文详细解析了双臂复合机器人中眼在手外标定的核心原理与实战流程。通过阐述坐标系转换与AX=XB方程,重点介绍了使用Intel RealSense D435相机进行标定的完整步骤,包括环境搭建、数据采集、计算与验证,并提供了关键的避坑指南,帮助工程师实现相机与机械臂基座间的精确坐标对齐。

weixin_29100927的博客 445

多线程\并发编程——ReentrantLock 详解

多线程\并发编程——ReentrantLock 详解 文章目录多线程\并发编程——ReentrantLock 详解一、ReentrantLock 的基本使用1、锁的可重入性语义2、lock() 和 unLock()3、tryLock() -- 尝试加锁4、lockInterruptibly() -- 等待可中断5、公平锁6、Condition--锁绑定多个条件二、ReentantLock 的底层实现—AQS三、ReentantLock 与 Synchronized 的异同(面试常问)1、相同点2、不同点1、

qq_42583242的博客 823

从Transformer到Mamba:显著性检测领域的计算效率革命(Samba框架深度解析)

本文深入解析了Samba框架在显著性目标检测(Salient Object Detection)领域的创新应用,通过结合Mamba架构的优势,实现了计算效率的革命性提升。Samba框架采用显著性引导的Mamba模块(SGMB)和上下文感知上采样(CAU),有效解决了传统CNN和Transformer的局限性,同时在RGB-D等多模态任务中展现出卓越性能。

mmm90的博客 557

全网首发--Unet3+改进16:在不同位置添加RepLKBlock超大卷积核

本文提出了一种基于大核卷积的神经网络架构RepLKNet,旨在缩小CNN与ViTs之间的性能差距。通过重新审视CNN中的大核设计,研究证明使用少量大卷积核替代多个小核能获得更强大的性能。提出的RepLKNet采用31×31大卷积核,在ImageNet和下游任务上取得了与SwinTransformer相当或更好的结果,同时具有更低延迟。文章详细介绍了实现步骤:(1)创建RepLKBlock模块文件;(2)在模型层中添加注意力机制;(3)在UNet模型中集成RepLKBlock;(4)完成训练流程。该方法展现了

AIcurator的博客 614

29、java的Lock 有哪几种常用的方法,以及它们分别都是干什么用的?

Lock 接口是 Java 5 引入的,最常见的实现类是 ReentrantLock,可以起到“锁”的作用。Lock 和 synchronized 是两种最常见的锁,锁是一种工具,用于控制对共享资源的访问。而 Lock 和 synchronized 都可以达到线程安全的目的,但是在使用上和功能上又有较大的不同。所以 Lock 并不是用来代替 synchronized 的,而是当使用 synchronized 不合适或不足以满足要求的时候,Lock 可以用来提供更高级功能的。

zht245648124的博客 943

STM32H750VB与AD5292通讯,写入阻值后,AD5292 的阻值没有变化,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1098

Java多线程-09 (Lock锁之ReentrantLock可重入锁)

synchronized被称为内部锁,在 JDK5 中增加了Lock 锁接口,lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。这也是多线程编程中一种保护线程安全的重要机制,它也被称为外部所,此接口有多个实现类,下面我们就来学习下Lock接口的一些实现类 1.1 锁的可重入性 锁的可重入是指,当一个线程获得一个对象锁后,再次请求该对象 锁时是可以获得该对象的锁的. ...

小北呱的博客 596

学Simulink——基于Simulink的Buck-Boost变换器双闭环PI+抗饱和设计建模示例

本文详细介绍了基于Simulink的非反相Buck-Boost变换器双闭环控制设计方法。针对Buck-Boost变换器特有的右半平面零点(RHPZ)和控制挑战,提出了电压-电流双闭环PI控制架构,并集成抗积分饱和机制。通过Simulink建模,实现了主电路、电流内环PI、电压外环PI、PWM及占空比限幅等模块的搭建,验证了在输入电压跌落(20V→10V)和负载突变(2A→4A)等场景下的稳定性能。仿真结果表明,输出电压波动小于0.35V,恢复时间快于1ms,电感电流有效限幅。文章还讨论了工程实践要点和扩展方

xiaoheshang_123的博客 318

【AI for Medecine】吴恩达医学图像AI专项课程(诊断、预测、治疗)

近期需要简单了解AI4Science上的一些应用,看到吴恩达大佬的专项课程,于是开始来个“全面”的了解--医学人工智能(诊断、预测、治疗)。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 770

java Lock锁的使用

引入**Lock**Lock接口提供了比传统的关键字更为灵活和可扩展的锁定机制。在包中定义了多个实现了Lock接口的类,其中最常用的是。使用lock()方法来获取锁。这一步类似于使用关键字进行同步,但提供了更灵活的控制。try {// 执行需要同步的代码块在finally块中使用unlock()方法释放锁,确保锁的释放,避免死锁和其他并发问题。使用方法可实现可中断的锁获取。在等待锁的过程中,线程可以被中断,以避免长时间的阻塞。try {// 可中断地获取锁// 执行需要同步的代码块。

大乐乐 1312

【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)和CA(匀加速),滤波使用EKF。附完整代码

CV模型:状态包含位置、速度和零加速度(9维状态),状态转移矩阵忽略加速度项CA模型:完整包含位置、速度和加速度(9维状态),状态转移矩阵包含二次项过程噪声矩阵Q分别根据两种模型的运动特性推导。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 560

Java编程中的Lock接口与ReentrantLock详解

Lock接口是Java 5引入的一个用于控制多线程对共享资源访问的接口。它提供了一种比传统的synchronized关键字更加灵活和强大的锁机制。Lock接口定义了锁获取和释放的基本操作,允许线程在需要时获取锁,并在完成操作后释放锁,从而确保对共享资源的独占访问。lock():获取锁。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态。:如果当前线程未被中断,则获取锁。如果已经中断,则抛出InterruptedException。tryLock()

347

YOLOv8深度集成SDFM:显著增强特征细节与多尺度融合,实现小目标检测革命性提升

本文介绍了如何将SDFM(Superficial Detail Fusion Module)模块集成到YOLOv8目标检测模型中,以提升特征融合效能。SDFM通过精细的特征预校准、通道注意力机制和动态加权融合策略,有效解决了多尺度特征融合中的细节保留问题。实验表明,集成SDFM后YOLOv8的mAP50-95提升12.7%,召回率提升9.0%,精确率提升5.9%,显著增强了模型性能。教程详细阐述了SDFM的工作原理、代码实现步骤及优化思路,为研究者和开发者提供了实用的技术指南。

FJN110的博客 117

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

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

多线程开发A - ReentrantLock 可重复锁详解

多线程开发 ReentrantLock 可重复锁详解 Condition await条件变量阻塞 Conditionsignal条件变量唤醒 ReentrantLocklock 获得锁 ReentrantLock unlock 释放锁 lockInterruptibly作用:持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待 new ReentrantLock();默认是非公平锁 new ReentrantLock(false); 公平锁 tryLock...

杨杨杨~~的博客 1083

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ReentrantLock详解

通过源码流程分析让我们更加深入了解了ReentrantLock锁的实现流程。

大乐乐 1369

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java同步的实现方式,以及synchronized与Lock的异同

C、tryLock(long timeout, TimeUnit timeUnit)方法:如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false。java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),相互之间产生冲突,将会导致数据不准确,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从而保证了该变量的唯一性和准确性。

cxbtdd的博客 1030

Lock 接口的简单使用

文章目录什么是 Lock?锁和同步块之间的区别?Lock 的定义Lock 中的方法lock()lockInterruptibly()tryLock()tryLock(long time,TimeUnit unit)unlock()举例:(Lock 的使用) 什么是 Lock? Lock 的中文意思指的是锁,Lock 是 java.util.concurrent.locks 包下的一个接口,该接口作...

Woo_home的博客 1681

多线程之Lock显示锁

文章目录ThreadLocal的使用什么是Lock显示锁Lock锁的使用lock()、unlock()方法trylock(定时锁)方法trylock()lockInterruptibly方法newCondition方法公平锁与非公平锁Reentrantlock常用方法 ThreadLocal的使用 除了控制资源访问外,还可以通过增加资源来保证线程安全,ThreadLocal主要解决为每个线程绑定自己的值,相当于增加了一个副本,在进行数据库访问的时候,多个线程需要自己独立的 static 成员变量吗,那就需要

weixin_44197016的博客 359

[Java]ReentrantLock的使用

在实际的编程中,代码往往有很多分支,调用了lock之后必须要调用unlock其他地方才能调用lock加锁,但是由于需要手动解锁,所以很有可能忘了unlock,为保证每个lock都能被unlock,使用trycatch中的finally代码块来确保最后都会释放锁。普通的lock方法如果有其他线程已经lock了,那线程就会阻塞并死等,但是使用trylock方法,就只会尝试加锁,然后返回true或者false来表明是否加锁成功,加锁失败就放弃加锁,也不死等。(3)提供了公平锁的版本。

qq_61925446的博客 925
上一篇: 面试锦集:手写一个同步类容器之Lock/Condition await signalAll实现
下一篇: JAVA多线程高并发之ReentrantLock讲解lockInterruptibly方法
饶艳辉
博客等级 码龄15年 20粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值