ReentrantLock 可重入锁的使用

十五天学会Autodesk Inventor,看完这一系列就够了(七),工程图纸 不管哪种绘图软件,二维或三维绘图,最终均需要转换成工程图纸,才能交给现场人员进行制作,这是任一产品图都要经历的过程。那本章开始,我们一起看一下Inventor是如何实现工程图纸? 阅读详情

何为可重入锁?当一个线程获得了当前实例的锁,并进入方法 a,这个线程在没有释放这把锁的时候,可以再次进入方法 a。

Synchronized和Lock区别

一、简介

Java 除了使用关键字synchronized外,还可以使用 ReentrantLock本地锁,Lock 的一个实现类实现排他锁(Exclusive Locks)的功能。而且 ReentrantLock 比 synchronized 功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。

二、使用

1️⃣简单使用:一个最基础的使用案例,也就是实现锁的功能。

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

public class ReentrantLockDemo {
    private static final Lock lock = new ReentrantLock();
    public static void main(String[] args) {
        new Thread(() -> test(), "线程A").start();
        new Thread(() -> test(), "线程B").start();
    }
    public static void test() {
        for (int i = 0; i < 2; i++) {
            lock.lock();
            System.out.println(Thread.currentThread().getName() + "获取了锁");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }
}

这里定义了一个 ReentrantLock,然后在 test 方法中分别 lock 和 unlock,如此就可以实现功能。再看看 ReentrantLock 和 synchronized 不一样的地方,那就是公平锁的实现。

2️⃣公平锁实现
对于公平锁的实现,要结合可重入性质。

public class ReentrantLockDemo {
    private static final Lock lock = new ReentrantLock(true);
    public static void main(String[] args) {
        new Thread(() -> test(), "线程A").start();
        new Thread(() -> test(), "线程B").start();
        new Thread(() -> test(), "线程C").start();
        new Thread(() -> test(), "线程D").start();
        new Thread(() -> test(), "线程E").start();
    }
    public static void test() {
        for (int i = 0; i < 2; i++) {
            lock.lock();
            System.out.println(Thread.currentThread().getName() + "获取了锁");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }
}

new 一个 ReentrantLock 的时候参数为 true,表明实现公平锁。在这里多定义几个线程ABCDE,然后在 test 方法中循环执行了两次加锁和解锁的过程:

3️⃣非公平锁实现
非公平锁就是随机的获取,谁运气好,cpu 时间片轮到哪个线程,那个线程就能获取锁。和公平锁的区别很简单,就在于 new ReentrantLock 的时候参数为 false,当然也可以不写,默认就是 false。测试结果:

4️⃣响应中断
响应中断就是一个线程获取不到锁,不会傻傻的一直等下去,ReentrantLock 会给予一个中断回应。在这里举一个死锁的案例:

public class ReentrantLockDemo {
    private static final Lock lockA = new ReentrantLock();
    private static final Lock lockB = new ReentrantLock();

    public static void main(String[] args) {
        Thread threadA = new Thread(new ThreadDemo(lockA, lockB));
        Thread threadB = new Thread(new ThreadDemo(lockA, lockB));
        threadA.start();
        threadB.start();
        threadA.interrupt();//第一个线程中断
    }

    static class ThreadDemo implements Runnable {
        Lock firstLock;
        Lock secondLock;
        public ThreadDemo(Lock firstLock, Lock secondLock) {
            this.firstLock = firstLock;
            this.secondLock = secondLock;
        }
        @Override
        public void run() {
            try {
                firstLock.lockInterruptibly();
                TimeUnit.MINUTES.sleep(50);
                secondLock.lockInterruptibly();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                firstLock.unlock();
                secondLock.unlock();
                System.out.println(Thread.currentThread().getName() + "获取到了资源,正常结束!");
            }
        }
    }
}

在这里定义了两个锁 lockA 和 lockB。然后使用两个线程 threadA 和 threadB 构造死锁场景。正常情况下,这两个线程相互等待获取资源而处于死循环状态。但是此时 threadA 中断,另外一个线程就可以获取资源,正常地执行了。测试结果:

5️⃣限时等待
通过 tryLock() 来实现,可以选择传入时间参数,表示等待指定的时间,无参则表示立即返回锁申请的结果:true 表示获取锁成功,false 表示获取锁失败。可以将这种方法用来解决死锁问题。首先还是测试代码,不过在这里不需要再去中断其中的线程了,直接看线程类是如何实现的:

static class ThreadDemo implements Runnable {
    Lock firstLock;
    Lock secondLock;

    public ThreadDemo(Lock firstLock, Lock secondLock) {
        this.firstLock = firstLock;
        this.secondLock = secondLock;
    }

    @Override
    public void run() {
        try {
            if (!lockA.tryLock()) {
                TimeUnit.MILLISECONDS.sleep(10);
            }
            if (!lockB.tryLock()) {
                TimeUnit.MILLISECONDS.sleep(10);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            firstLock.unlock();
            secondLock.unlock();
            System.out.println(Thread.currentThread().getName() + "正常结束!");
        }
    }
}

在这个案例中,一个线程获取 lockA 时候第一次失败,那就等 10 毫秒之后第二次获取,就这样一直不停的调试,一直等到获取到相应的资源为止。当然,可以设置 tryLock 的超时等待时间 tryLock(long timeout,TimeUnit unit),也就是说一个线程在指定的时间内没有获取锁,那就会返回 false,就可以再去做其他事了。

保姆级教程:用中移ML307模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码 本文详细介绍了如何使用中移ML307系列模组对接高德/OneOS定位服务,从配置apikey到解析+MLBSLOC状态码的全过程。涵盖高德定位服务和OneOS定位服务的配置步骤、常见错误处理及性能优化技巧,帮助开发者快速实现基站定位功能,提升物联网项目的定位精度和稳定性。 阅读详情

相关推荐

Kubernetes多网卡环境下Calico网络配置避坑指南:如何精准指定业务网卡

本文针对Kubernetes多网卡环境下Calico网络配置的常见痛点,提供了精准指定业务网卡的实战指南。通过深入分析Calico的IP自动检测机制,详细解读并对比了五种IP_AUTODETECTION_METHOD配置方法(如interface、cidr、can-reach等),帮助运维人员从根源上解决网络分区和Pod通信失败问题,确保生产集群网络的稳定与可靠。

weixin_28835551的博客 729

可重入锁的概念及使用场景

可重入锁的概念及使用场景

weixin_64229691的博客 3829

Astah 9.0升级步骤(Widnows/Mac OS)

Astah Professional是一款全新的轻量级UML建模工具。软件集思维导图和UML建模于一体,采用100%纯JAVA构建, 兼容性强,不仅能够实现分布式建模、项目合并,还能够实现和其它建模工具的交互。

tequiero777的博客 2824

多线程(五)可重入锁、读写锁

ReentrantLock、ReentrantReadWriteLock

HK的博客 3418

51单片机超声波测距数码管显示并报警(Proteus 仿真)

HC-SR04超声波 实物图 使用方法 1、给TRIG端口至少10us 的高电平信号 2、模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回 3、有信号返回,ECHO端口会输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间 计算的话这里就不考虑温度的影响直接用声速340m/s Proteus仿真 HC-SR04可以用Proteus中的SRF04代替 下面附上代码 ...

m0_46254883的博客 1万+

MOSS-TTS开源语音合成家族:从架构解析到生产部署实战

语音合成(TTS)技术旨在让计算机将文本转换为自然流畅的语音,其核心原理通常涉及文本分析、声学模型和声码器等模块。近年来,基于深度学习的端到端TTS模型,特别是结合残差向量量化(RVQ)和Transformer架构的方案,显著提升了合成语音的自然度和效率。这类技术的价值在于能够广泛应用于有声内容创作、智能助手、无障碍服务以及实时交互等场景。本文聚焦于开源的MOSS-TTS家族,它通过模块化设计,针对高保真合成、多角色对话、实时交互等不同需求提供了专用模型。文章深入解析了其底层的Delay与Local两种架构

weixin_28745565的博客 417

Java锁之可重入锁

ReentrantLock可以实现公平锁和非公平锁ReentrantLock默认实现的是非公平锁ReentrantLock的获取锁和释放锁必须成对出现,锁了几次,也要释放几次释放锁的操作必须放在finally中执行实例方法tryLock()会尝试获取锁,会立即返回,返回值表示是否获取成功实例方法tryLock(long timeout, TimeUnit unit)会在指定的时间内尝试获取锁,指定的时间内是否能够获取锁,都会返回,返回值表示是否获取锁成功,该方法会响应线程的中断。

echola_mendes的博客 2397

Windows 10 下 DockerToolbox 安装全攻略:从下载到配置阿里云镜像加速

本文详细介绍了在Windows 10系统上安装和配置DockerToolbox的完整流程。从下载安装包、执行初步安装,到关键步骤——修改虚拟机存储路径以及配置阿里云镜像加速器,旨在帮助开发者,尤其是初次接触Docker的新手,快速搭建高效的本地容器开发环境,并解决国内镜像下载缓慢的痛点。

moon9的博客 474

可重入锁ReentrantLock的原理及使用

在公平模式下,锁会按照线程的请求顺序分配,遵循先进先出的原则。构造方法接受一个可选的公平参数(默认非公平锁),当设置为true时,表示公平锁,否则为非公平锁。公平锁的效率往往没有非公平锁的效率高,在许多线程访问的情况下,公平锁表现出较低的吞吐量。ReentrantLock是一个强大而灵活的同步工具,它提供了更多的控制选项和功能,适用于各种复杂的同步需求。方法,它可以尝试获取锁,如果锁当前不可用,则立即返回结果。,因此在使用时需要谨慎,并确保正确处理锁的获取和释放,以避免死锁和其他并发问题。

apple_51673523的博客 1989

Mamba SSM 实战:IMDb 文本分类 + Mamba-ssm 全流程

Mamba SSM 文本分类链路:IMDb 二分类 → MambaLMHeadModel (d_model=256, n_layer=8, d_state=16, exp2=2) → 末 token 分类头。5 epoch 达 89.2% 准确率 (与 BERT-base 持平), 但显存降低 44% (3.5GB vs 6.2GB)。建议序列长度 ≥ 1024 再选 Mamba, 短序列 (< 512) 用 BERT 更高效。扩展时注意d_state。

m0_71589036的博客 57

SAP 生产订单工序删除状态撤回简介

2、我们在前台对于生产订单的状态一个是在生产订单抬头中的状态,另外一个是针对上面一直在测试的是工序的状态,这个两个状态是前台可见的状态,实际生产订单还有一个组件物料的状态,这个状态是不可见的一个状态。生产订单中的0010工序中对应的组件的栏位被标识,表示有物料分配到了0010的工序中,正常情况下0010的工序被分配了工序是不应该被删除的。将已领料的工序删除掉,导致异常的发生。当物料已领料会,用户仍然把已分配的物料的工序删除掉,导致后续业务操作过程中产生异常,如下图中所示,0010的工序被打上了删除标识。

我小时候很黑的博客 1938

ReentrantLock 可重入锁

ReentrantLock是Java并发包中提供的可重入锁实现,相比synchronized关键字具有更丰富的功能特性。它支持公平/非公平锁、可中断获取锁、超时机制、多个条件变量等高级功能,同时需要显式调用lock()和unlock()方法进行锁管理。

W18263823008的博客 2959

第 13 章:Spring AI Alibaba MCP 与 Nacos3 — 企业级MCP服务

理解Spring AI Alibaba 框架下的MCP服务与Nacos注册中心整合的必要性,学会Spring AI Alibaba-基于Nacos的MCP实现方法

paopao_wu的专栏 788

ReentrantLock(可重入锁)源码解读与使用

ReentrantLock是一种独占式的可重入锁,位于JUC包下,是Lock接口的默认实现类。有三个特性:支持可重入,支持公平与非公平特性,提供堵塞锁和非阻塞锁两种获取方法(lock和trylock) 其中内部锁的竞争是基于AQS实现的,当某一线程获取锁后,将state值+1,并记录下当前持有锁的线程,再有线程来获取锁时,判断这个线程与持有锁的线程是否是同一个线程,如果是,将state值再+1,这样就实现了锁的可重入。当线程释放锁时,将state值-1,当state值减为0时,表示当前线程彻底释放了锁,唤

qq_35716689的博客 9102

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

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

pscad IEEE标准系统搭建说明

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

最常用的锁:ReentrantLock可重入锁

本文系统解析了Java并发编程中的ReentrantLock同步工具。作为synchronized的增强替代方案,ReentrantLock通过AQS实现,具备可重入性、可中断锁获取、公平/非公平模式选择及多条件变量等核心特性。文章详细对比了其与synchronized的差异,包括灵活性、性能表现和使用复杂度,并给出标准使用流程(必须在try-finally中确保锁释放)和典型应用场景(如生产者-消费者模型)。最后指出应基于具体需求在易用性(synchronized)与高级功能(ReentrantLock)

2401_85973273的博客 1534

假人有限元模型

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

详解ReentrantLock为什么是可重入锁

- 可重入,即一个线程可以多次(重复)进入同类型的锁而不出现异常(死锁); - ReentrantLock提供两类锁:公平锁和非公平锁; - 可重入是因为可重锁lock中核心逻辑:如果CAS,成功,则继续执行设置独占,setExclusiveOwnerThread;CAS失败,进入可重入逻辑; - 可重入执行逻辑入口:acquire(...),java.util.concurrent.locks.AbstractQueuedSynchronizer#acquire

天然玩家的博客 3817

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ReentrantLock可重入锁

摘要:ReentrantLock是Java提供的可重入锁实现,相比synchronized具有更丰富的功能,包括支持公平/非公平锁、可中断获取、超时机制和多条件变量等。其核心方法包含lock()、tryLock()、unlock()等操作,通过Condition可实现精细的线程等待/唤醒控制。内部采用Sync、NonfairSync和FairSync三个类实现不同的锁策略。与synchronized相比,ReentrantLock提供了更灵活的锁控制,但需要手动管理锁的获取和释放。适用于需要高级同步特性的复

SHGXO183的博客 1073

什么是可重入锁ReentrantLock?

什么是可重入锁ReentrantLock?

java1234的博客 1110

ReenTrantLock可重入锁(和synchronized的区别)总结

ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。   锁的实现: Synchronized是依赖于JVM实现的

qq838642798的博客 5万+

可重入锁ReentrantLock源码解读

ReentrantLock基于AQS,在并发编程中它可以实现公平锁和非公平锁来对共享资源进行同步。同时,和synchronized—样,ReentrantLock支持可重入。除此之外,ReentrantLock在调度上更灵活,支持更多丰富的功能。在Java SE 5 之后,并发包中新增了Lock接口用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显示地获取和释放锁。Lock的意义在于提供了区别于synchronized的另一种具有更多广泛操作的同步方式。

小小本科生 1153

可重入锁 ReentrantLock

多线程笔记(十二):概念 可重入锁,指的是同一线程外层函数(方法)获得锁之后,内层函数(方法)仍然能获得该锁的代码,同一线程在外层方法获取锁的时候,再进入内层方法会自动获取锁。 简言之:已经获得该锁的线程,可以重复再次进入被该锁锁定的代码块。 ReentrantLock 能够代替 synchronized 关键字完成独占锁的功能,并且允许占有锁线程的重入,显示地调用lo...

扛麻袋的少年的博客 1332

什么是可重入锁?深入探讨Java中的ReentrantLock

在多线程编程中,确保线程安全是一个至关重要的任务。锁(Lock)是实现线程同步的一种常见机制,用于保护共享资源,防止多个线程同时访问。然而,普通的锁在某些情况下可能会导致死锁或不必要的阻塞。为了解决这些问题,Java提供了可重入锁(Reentrant Lock)。本文将深入探讨可重入锁的概念、工作原理及实际应用,并通过代码示例和详细解释帮助你全面理解其工作原理及实际应用。在计算机科学中,锁是一种同步机制,用于确保在同一时间只有一个线程可以访问共享资源。

xycxycooo的博客 1437

深入理解 ReentrantLock 可重入锁

摘要:ReentrantLock是Java提供的一种可重入互斥锁,相比synchronized具有更灵活的锁机制。它支持公平/非公平锁、可中断、超时获取和条件变量等特性。底层基于AQS实现,通过state变量记录锁状态,CLH队列管理等待线程。适用于需要精细控制线程同步的场景,如生产者-消费者模型。ReentrantLock在保持高性能的同时提供了比synchronized更强大的功能,是多线程编程的重要工具。

m0_63478844的博客 1087

Java 并发编程之 ReentrantLock 可重入锁详解

本文介绍了Java并发编程中的ReentrantLock锁机制。ReentrantLock作为synchronized的替代方案,具有可重入性、公平锁选择、可中断获取、超时等待等特性。文章详细讲解了其基本使用方法,包括创建实例、加锁解锁操作,并通过示例代码演示了可重入特性。同时对比了ReentrantLock与synchronized的区别,指出前者在功能性和灵活性上的优势,适用于需要复杂锁控制的并发场景。最后强调使用时需注意锁释放,合理选择锁模式以保证线程安全与性能平衡。

2301_80866152的博客 1116

深入解析Java中的可重入锁ReentrantLock

本文将从ReentrantLock的核心特性出发,深入解析其可重入性和实现机制。通过对比synchronized关键字,探讨ReentrantLock的优势与适用场景。文章还将结合实际案例,分析如何正确使用ReentrantLock来解决锁膨胀问题,帮助开发者在高并发场景中做出更优选择。

yanpeng2580的博客 837
上一篇: synchronized 和 Lock 的区别
下一篇: 进程之间的8种通信方式
JFS_Study
博客等级 码龄6年 363粉丝 359原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值