JAVA多线程进阶篇 2、JUC重入锁之ReentrantLock

11 CO配置-控制-成本中心会计-定义分割结构(OKES-Define Splitting Structure) 业务背景:定义分割结构 事务码: OKES SPRO路径:SPRO->控制->成本中心会计->实际过账->期末结算->作业分配->划分->定义分割结构 第1步,SPRO路径进入 第2步,选择“新的条目”创建 分割结构 第3步,选择分割结构代码 点击“分割规则”进行下一个界面,点击“新条目”创建 分割结构规则 第4步,点击“为规则选择” 为分割结构规则创建版本并保存 第5步,选择“分配”,点击“新的条目” 输入分割结构分配 阅读详情

JUC 即 java.util.concurrent 包,提供了大量的工具类来简化并发编程。

ReentrantLock类是一种新增的加锁方法,其底层是CAS原理,能够在许多场景下代替代synchronized,且具有一些优势。

1 使用方法

使用该方法需要显式加锁和解锁,以下是标准写法。

ReentrantLock lock = new ReentrantLock();
try {
	lock.lock();
    dosomething();
} finally {
    lock.unlock();
}

2. 锁的可重入

锁是可重入的,否则会导致死锁。

如下代码,有A、B两个方法,都是同一个锁,如果线程通过调用A方法获取了锁,那紧接着就可以调用B方法。

如果没有这个机制,那么调用A方法后,就无法调B方法,程序就运行不下去了。

  • synchronized
public class ReentranceLockSynTest {

    synchronized void A(){
        System.out.println("A被调用了");
        B();
    }

    synchronized void B(){
        System.out.println("B被调用了");
    }

    public static void main(String[] args) {
        new Thread(()->{
            new ReentranceLockSynTest().A();
        }).start();
    }
}
  • ReentrantLock同样是可重入的。
public class ReentranceLockTest2 {
    Lock lock = new ReentrantLock();

    void A() {
        try {
            lock.lock();
            System.out.println("A被调用了");
            B();
        } finally {
            lock.lock();
        }
    }

    void B() {
        try {
            lock.lock();
            System.out.println("B被调用了");
        } finally {
            lock.lock();
        }
    }

    public static void main(String[] args) {
        ReentranceLockTest2 test2 = new ReentranceLockTest2();
        new Thread(test2::A,"t1").start();
    }
}

2. ReentrantLock的特性

2.1 trylock

和synchronized不同,ReentrantLock可以设置超时时间,如果超出时间就不会等待。
public class TryLockTest {
    Lock lock = new ReentrantLock();
    void A(){
        System.out.println("A begin");
        try {
            lock.lock();
            for(int i=0;i<10;i++) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println("m1");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        } finally {
            lock.unlock();
        }
    }

    void B(){
        System.out.println("B begin");
        try {
            lock.tryLock(2,TimeUnit.SECONDS);
            System.out.println("m2 get lock");
        }
        catch (InterruptedException e) {
            System.out.println("B ,太久了,我不等了");
        }
        finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) throws InterruptedException {

        TryLockTest test = new TryLockTest();

        new Thread(test::A,"t1").start();

        Thread.sleep(1000);

        new Thread(test::B,"t2").start();

    }
}

运行结果显示,当B线程等待三秒后,就没有继续等待,放弃了加锁。
trylock

2.2 可以设置公平锁或非公平锁

synchronized锁只能是非公平锁。非公平锁意味着线程用抢占的方式去抢锁,跟等多久没有关系。公平锁意味着等待时间越久的线程有更高的优先级。

    Lock lock = new ReentrantLock(true);
  • 可以接收interrupt通知,这一点在《JAVA多线程基础篇 三、如何优雅结束一个线程》有介绍。
   lock.lockInterruptibly();

总结

ReentrantLock是具有更多自定义功能的锁,能够重入、可以设置超时时间、能够接收打断信息、以及设置公平锁。
ReentrantLock的加锁与解锁是有标准写法的,比须在finally块中进行关闭。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

NX二次开发(Python)-UIStyler-选择体和按钮操作 用UG NX的UIStyler块界面编辑器,生成带有“选择体”和“按钮”操作的一个界面,如下图所示: 阅读详情

相关推荐

银河麒麟V10系统下,手把手解决Ollama安装报错‘GLIBCXX_3.4.25 not found’

本文详细介绍了在银河麒麟V10系统下解决Ollama安装报错‘GLIBCXX_3.4.25 not found’的实战指南。通过隔离编译新版libstdc++、环境变量引导和服务化封装等安全方案,确保在不破坏系统稳定性的前提下顺利运行Ollama,适用于国产操作系统与AI工具的兼容性需求。

weixin_42556197的博客 484

两种方式手写ReentrantLock

两种方式手写ReentrantLock

java架构师分享,有问题可以联系我 124

五、e2studio VS STM32CubeIDE之汉化

介绍stm32cubeide汉化方案和汉化包e2studio自带汉化包,在安装过程中可选择安装e2studio STM32CubeIDE切换中英文。

cl234583745的博客 1766

Java并发之ReentrantLock锁

简介 一种可重入的互斥锁,经由Java5引入,支持一个线程对资源的重复加锁。它和synchronized语句和方法访问的隐式监视器锁,有相同的基本行为和语义,但是功能更强大。 一、Lock接口 锁对象,在java中锁是控制多个线程访问共享资源的方式,一个锁能防止多个线程同时访问共享资源(但有的锁就允许多个线程并发访问,如读写锁)。在Lock接口出现之前,是靠synchronized关键字来实现锁的...

墨玉浮白的博客 1245

VS Code配置Java开发环境避坑指南:从JDK到Spring Boot插件全流程

本文详细介绍了在VS Code中配置Java开发环境的完整流程,涵盖JDK选择、环境变量配置、核心插件安装、构建工具优化及Spring Boot项目专项设置。特别针对常见问题提供避坑方案,帮助开发者快速搭建高效稳定的开发环境,提升Java和Spring Boot开发效率。

weixin_28839699的博客 979

告别环境配置焦虑:在Win10的Ubuntu子系统里搞定CSAPP实验环境(附32/64位库编译指南)

本文详细介绍了如何在Win10的Ubuntu子系统中搭建CSAPP实验环境,包括WSL 2的安装与配置、32/64位库的编译指南以及高效开发工具链的设置。通过优化WSL性能和使用实用技巧,开发者可以轻松应对CSAPP实验中的环境配置问题,提升学习效率。

weixin_30443813的博客 296

Java多线程12:ReentrantLock中的方法

公平锁与非公平锁 ReentrantLock有一个很大的特点,就是可以指定锁是公平锁还是非公平锁,公平锁表示线程获取锁的顺序是按照线程排队的顺序来分配的,而非公平锁就是一种获取锁的抢占机制,是随机获得锁的,先来的未必就一定能先得到锁,从这个角度讲,synchronized其实就是一种非公平锁。非公平锁的方式可能造成某些线程一直拿不到锁,自然是非公平的了。看一下例子,new ReentrantLo...

weixin_33859504的博客 221

告别手动脚本!用TSMaster Python小程序5分钟搞定CAN报文自动发送

本文介绍了如何使用TSMaster的Python小程序功能快速实现CAN报文自动发送,大幅提升汽车电子测试效率。通过简洁的Python代码示例,展示了如何替代传统手动操作和复杂C脚本,实现周期性发送、动态修改报文内容等常见需求,帮助工程师5分钟内完成自动化配置。

weixin_30292843的博客 511

Java的ReentrantLock(可重入锁)详解上篇

比如我们有两个线程A,B,第一个线程A已经获取到锁了,B在获取锁的时候肯定获取不到,则会把B包装成Node,然后加入到同步的等待队列中,此时队列中只有一个head头节点和线程B所在的Node节点,head头节点在初始化时,它的waitStatus等于0,在第一次循环时,把头节点的waitStatus更新为SIGNAL,也就是-1,第二次循环时,因为head节点额waitStatus等于-1,所以在第一个if时,直接返回了true,告诉我们可以把当前线程中断掉。

lt_xiaodou的博客 3469

如何实现chrome谷歌浏览器多开(独立环境 独立cookie)

由于各种各样的原因,你可能需要在一个电脑登录某个平台,比如一个电脑登录3个公众号,或者3个知乎等等。最简单的方案是,直接安装3个不同的浏览器,比如一个谷歌浏览器,一个火狐浏览器,一个 Edge 浏览器。这个方案也能解决,但如果想多开10个呢?安装10个不同的浏览器也能解决,但感觉这样比较复杂,另外一方面安装太多的应用,会导致电脑卡顿。这里给大家介绍,我在 Win 和 Mac 系统下的躲开解决方案。Win 系统下的解决方案最为简单,原理就是给不同的谷歌浏览器,指向不同的用户存储路径即可。

lzqial1987的专栏 1万+

【完整梳理验证】企业微信第三方应用接入全流程java版

由企业内部的开发者自己开发部署,相当于是企业自己的资产,调用接口基本没有任何限制。由SaaS服务商的开发者开发并部署在服务商侧,面向所有企业。需要企业授权使用(先试用后付费),服务商仅可获取企业授权部分的权限,相当于白名单控制。由服务商的开发者开发,但部署在企业内部。一般是线下签约采购方式,因此权限几乎与自建应用无异,企业管理员只需要配置不对服务商开放的敏感权限,相当于黑名单控制。服务商后台地址:企业微信服务商官网企业管理后台地址:企业微信管理后台服务商,可以理解为 SAAS 中的运营端。企业管理端,可以理

Hello, New World! 2760

Java——聊聊JUC中的锁(synchronized & Lock & ReentrantLock)

这篇文章是关于锁的,是入门级别的文章,后续还会有更深入、更底层的JUC,我会慢慢更新的。。。

java_lujj的博客 500

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java多线程(3)---锁策略、CAS和JUC

本文讲解多线程的各种锁策略、CAS的详细、JUC的类

tq02的博客 1762

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

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

到底什么是重入锁,拜托,一次搞清楚!

Java技术栈www.javastack.cn优秀的Java技术公众号相信大家在工作或者面试过程中经常听到重入锁这个概念,或者与关键字 synchrozied 的对比,栈...

Java技术栈,分享最主流的Java技术 2729

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java多线程——JUC ReentrantLock使用详解一篇就够,以及使用ReentrantLock避免死锁情况的产生

什么是ReentrantLock 简单的来讲ReentrantLock是JUC提供的一种与synchronized关键字加锁作用类似的类。 与synchronized关键字相比,ReentrantLock有如下特点: 可中断(一个线程可以通过interrupt方法取消另一个线程的锁等待) 可以设置竞争锁资源的超时时间 可以设置公平锁(synchronized关键字释放锁资源之后,其他在关联该对象Monitor的阻塞线程将会再次竞争锁资源,并没有先来先得,后来后得的公平性) 支持多个条件变量(sy

保暖透气大裤衩LeoLee的博客 1105

深入解析Java多线程与并发编程(五)(JUC显示锁、AQS抽象同步器以及JUC高并发容器)

本文介绍了JUC显式锁、AQS抽象同步器以及JUC高并发容器的基本概念。JUC显式锁是一种灵活的Java实现锁,支持多种锁操作,如可轮询、定时、可中断等。显式锁的核心接口是Lock,其主要实现类为ReentrantLock,具有可重入、独占等特性。显式锁可分为可重入锁、不可重入锁、悲观锁、乐观锁、公平锁、非公平锁、可中断锁、不可中断锁、共享锁和独占锁等类型。悲观锁适用于写多读少场景,而乐观锁适用于读多写少场景。公平锁保障线程按顺序获取锁,非公平锁则不保证。可中断锁允许在抢占过程中中断,而不可中断锁则不允许。

wxchyy的博客 1416

Java 多线程进阶(四)-- 锁策略,CAS,synchronized的原理,JUC当中常见的类

偏向锁,如果没有人竞争这个锁,synchronized就标记一下,不加锁,就加上一个标记,这时如果要解锁也会更加高效,后续如果有锁竞争了就立马加上锁,也保证了线程安全问题。针对第一点,每个链表都是一把小锁,需要我们把每个链表的头节点作为一个锁对象,因为synchronized可以把任何对象作为锁对象。偏向锁的核心思想,就是’’ 懒汉模式 ‘’ 的另一种体现,能不加锁就不加锁,加锁就意味着有开销。CAP这里循环判定,如果值是有变化了,就是存在其他线程在这里穿插执行了,所以这里更新了一下值。

的博客 1997

JavaEE初阶——多线程进阶:从 “锁策略小白” 到 “JUC 高手”,这篇干货文收藏就够了

本文深入探讨Java多线程高并发编程中的核心概念与实现机制。从锁策略分类入手,详细解析了乐观锁与悲观锁、重量级与轻量级锁、自旋锁、公平锁等核心概念及其适用场景。重点剖析了CAS机制原理及其在原子类中的应用,以及synchronized的锁升级过程(无锁→偏向锁→轻量级锁→重量级锁)。同时介绍了JUC工具包中的关键组件,包括Callable/FutureTask异步编程模型、ReentrantLock特性比较,以及线程池ThreadPoolExecutor的参数配置和工作原理。通过生动的比喻和代码示例,帮助读

此人很懒,什么都留下了...快进来看看吧 1442

Java学习-JUC

Java关于并发编程下面的JUC工具包的学习,包含了CAS、常见锁、锁优化原理、并发容器等

qq_56760790的博客 1277

Java并发编程|第六篇:ReentrantLock 重入锁

Java并发编程|第六篇:ReentrantLock 重入锁 文章目录Java并发编程|第六篇:ReentrantLock 重入锁前言1.类图分析2.预备知识2.1 什么是AQS2.2 CAS实现原理3.ReentrantLock 源码分析3.1 加锁流程lock.lock() 时序图lock()入口acquire()tryAcquire()addWaiter ()enq(node)Node 的一...

谢文峰的博客 323

Java并发(8)--JUC之同步队列器AQS原理、重入锁ReentrantLock、读写锁ReentrantReadWriteLock

文章目录一. AQS 原理1.1 addWaiter()是如何保证多线程运行下入队操作的正确性?1.2 enq(Node) 的CAS自旋volatile变量1.3 acquire(int)方法总结1.4 release(int) 方法总结1.5 AQS应用注意点二. 重入锁 ReentrantLock2.1 互斥锁 Mutex2.2 ReentrantLock 重进入的源码分析(非公平性)...

lililuni的博客 660

java多线程并发重入锁ReentrantLock源码详细分析

synchronized同步代码块 一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞 /** * @company: 拓薪教育 * @author: 大亮老师 QQ:206229531 */ public class Test1 { public static void main(String[] args) { ...

694

高级JAVA知识图及JUC讲解(看懂学半年进大厂无压力)

知识框架梳理 核心知识框架图         以前待过一个公司,然后公司领导特别nice,10几年的大厂经验,然后技术也特别扎实全面,我们从他那边学到很多东西, 但是他教给我们有价值的干货,还得属于2017年年终review时候的分享的学习方法,我们知道授人予鱼不如授人予渔,无可 置疑,get到学习的method比get到属性有价值得多。   其实,他教我们学习java的办法很简单,总结...

DanielAntony的博客 4982

【JUC基础学习笔记】

JUC基础学习笔记一、JUC概述1. JUC是什么2. 进程与线程3. 并发与并行4. sleep() 和 wait()等方法二、Lock1. Synchronized2. Lock接口与方法3. 两者异同4. Lock接口重要实现类三、线程通信 / 线程同步1. Synchronized同步块2. Lock锁四、线程安全1. 阻塞同步2. 非阻塞同步3. 非同步五、集合的线程安全1. 并发集合 ArrayList2. Vector3. Collections4. JUC.CopyOnWriteList..

sixteen_16的博客 1万+

java高并发程序设计:JUC

《实战java高并发程序设计》第三章草记 文章目录《实战java高并发程序设计》第三章草记前言一、多线程的团队协作:同步控制1.1重入锁一、pandas是什么?一、pandas是什么?一、pandas是什么?一、pandas是什么?一、pandas是什么?一、pandas是什么?一、pandas是什么?一、pandas是什么?一、pandas是什么?一、pandas是什么?一、pandas是什么?一、pandas是什么?一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 本文为作者学

qq_42673707的博客 631

到底什么是重入锁,一次搞清楚!(不要麻烦了)

这个是 JDK @since 1.5 添加的一种颗粒度更小的锁,它完全可以替代 synchronized 关键字来实现它的所有功能,而且 ReentrantLock 锁的灵活度要远远大于 synchronized 关键字。从类结构图看出,ReentrantLock 实现了 Lock 接口,ReentrantLock 只是 Lock 接口的一个实现而已。它们都是 java.util.concurrent 包里面的内容(俗称 JUC、并发包),也都是 JDK 1.5 开始加入的。

java_xiaoo的博客 1974
上一篇: JAVA多线程进阶篇 1、JUC原子类之Atomic
下一篇: JAVA多线程进阶篇 4、JUC同步器之Countdownlatch
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

悟空学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值