java并发-ReentrantLock

多线程系列(八) -ReentrantLock基本用法介绍 在之前的线程系列文章中,我们介绍到了使用synchronized关键字可以实现线程同步安全的效果,以及采用wait()、notify()和notifyAll()方法,可以实现多个线程之间的通信协调,基本可以满足并发编程的需求。 阅读详情

当多个线程需要同时对共享资源进行操作时,就需要用到线程同步技术。Java中提供了synchronized关键字用于线程同步,而ReentrantLock就是另外一种用于线程同步的技术,本文将介绍ReentrantLock及其使用方法。

### 1. 概述

ReentrantLock是Java中提供的一个可重入锁,可以用于替代synchronized关键字实现线程安全的同步。它和synchronized关键字类似,但是提供了更多的同步控制功能。

ReentrantLock是ReentrantLock类的实例化对象,其核心方法是lock()和unlock(),在线程访问共享资源时,获取锁之后进行操作,操作完成之后释放锁,以便其他线程也能访问共享资源。

### 2. 使用方法

#### 2.1 基本使用

使用ReentrantLock需要先创建一个ReentrantLock实例,然后在共享资源访问前调用lock()方法获取锁,在共享资源访问完毕后调用unlock()方法释放锁。

```java
ReentrantLock lock = new ReentrantLock();

public void accessResource() {
    lock.lock();
    try {
        // 访问共享资源
    } finally {
        lock.unlock();
    }
}
```

在使用Lock时,需要注意访问共享资源的代码要放在try...finally块中,因为只有在finally块中释放锁才能保证锁的正确释放。

#### 2.2 tryLock方法

ReentrantLock提供了一个tryLock()方法,它可以尝试获取锁,如果获取成功则返回true,否则返回false。使用tryLock()方法可以避免线程因等待获取锁而被阻塞的情况。

```java
ReentrantLock lock = new ReentrantLock();

public void accessResource() {
    if (lock.tryLock()) {
        try {
            // 访问共享资源
        } finally {
            lock.unlock();
        }
    } else {
        // 如果获取锁失败,则执行其他逻辑
    }
}
```

#### 2.3 LockInterruptibly方法

ReentrantLock还提供了LockInterruptibly()方法,它可以在获取锁时响应中断。如果当前线程被中断,则会立即抛出InterruptedException异常。

```java
ReentrantLock lock = new ReentrantLock();

public void accessResource() throws InterruptedException {
    lock.lockInterruptibly();
    try {
        // 访问共享资源
    } finally {
        lock.unlock();
    }
}
```

#### 2.4 使用条件对象

ReentrantLock还可以使用条件对象(Condition)来实现更精细的线程同步。条件对象可以通过ReentrantLock的newCondition()方法创建,然后使用await()方法等待条件变量,使用signal()方法通知等待线程条件变量已经发生变化。

```java
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();

public void accessResource() throws InterruptedException {
    lock.lock();
    try {
        while (condition不满足) {
            condition.await();
        }
        // 访问共享资源
    } finally {
        lock.unlock();
    }
}

public void changeCondition() {
    lock.lock();
    try {
        // 改变条件变量的值
        condition.signalAll();
    } finally {
        lock.unlock();
    }
}

`ReentrantLock` 是一个可重入的互斥锁,其底层结构使用了一个同步器 `Sync` 来实现。`ReentrantLock` 提供了两种实现方式:公平锁和非公平锁。

公平锁指的是获取锁的线程按照请求锁的顺序来获取锁,即先来先得。而非公平锁则是多个线程同时抢占锁,不保证获取锁的顺序,可能会导致某些线程一直获取不到锁。

从底层实现来讲,公平锁和非公平锁的区别在于 `Sync` 类的 `tryAcquire` 方法的实现。

对于公平锁,`tryAcquire` 方法中会先检查队列中是否有等待锁的线程,如果有的话,当前线程就不会去争抢锁,而是会进入到等待队列中,等待锁被释放后再次尝试获取锁。如果队列中没有等待锁的线程,则通过 `CAS` 操作去尝试获取锁。

对于非公平锁,`tryAcquire` 方法中则直接通过 `CAS` 获取锁,此时不会去检查等待队列中是否有线程在等待锁。

因此,公平锁对于线程的调度和执行效率都会影响比较大,因为它必须按照请求锁的顺序来分配锁。而非公平锁则可能会导致某些线程长时间等待锁,但它的执行效率相对较高,因为可以并发获取锁。

### 3. 总结

ReentrantLock提供了更灵活、更安全的线程同步机制,可以替代synchronized关键字实现线程安全的同步。它提供了多种同步控制方法,包括获取锁的尝试、响应中断、使用条件变量等。使用ReentrantLock时需要注意锁的粒度,避免出现线程死锁的情况。

Java并发之ReentrantLock原理详解 一、ReentrantLock是什么?    ReentrantLock是Lock接口的默认实现,是一种独占锁。相对synchronized而言,ReentrantLock提供了更多的操作方式以及更细粒度的加锁方式。    主要特性:    (1)可重入。ReentrantLock是可重入锁,因为它会记录之前获得锁线程对象,保存在exclusiveOwenerThread变量中,当一个线程要获取锁... 阅读详情

相关推荐

Java并发之ReentrantLock 与 synchronized

ReentrantLock ReentrantLock直译为重入锁,又称为递归锁。 是指在同一个线程中,外部方法获得锁之后,内层的递归方法依然可以获取该锁 倘若锁不具备可重入性,那么我们在第二次获取锁的时候就会造成死锁 复制代码 ReentrantLock的实现是基于AQS的,实现了锁机制和重入机制 ReentrantLock在底层有两种实现方式,分别是公平锁(FairSync)和非公平锁(NonfairSync) public ReentrantLock() { sy

m0_69305074的博客 612

Java中ReentrantLock的使用

一、基本概念 可重入锁:也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。 在JAVA中ReentrantLock 和synchronized 都是可重入锁; 重入锁ReentrantLock 相对来说是synchronized、Object.wait()和Object.notify()方法的替代品(或者说是增强版),在JDK5.0的早期...

black_bird_cn的博客 2万+

五子棋AI算法第一篇-我对谷歌Alphago的看法

最近Google宣布他们的围棋AI以5:0的战绩打败欧洲围棋三冠王。我一直对人工智能比较感兴趣,正好趁年前空闲的几天用JS写了一个五子棋的AI。其实很久以前就用自创的算法写过一个JAVA版的五子棋AI,不过棋力很不理想。这次用的是JS写的,所以无论任何平台上只要能打开网页的都可以玩。google爆出这个新闻之后,很多人觉得这是不是意味着电脑智商已经在人类之上了,围棋已经没有意义了之类的。甚至觉得这是

言川的博客 2万+

[Java]ReentrantLock的使用

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

qq_61925446的博客 925

数字IC后端时钟树综合实战:OCC电路优化与时钟树平衡策略

本文深入探讨了数字IC后端设计中时钟树综合的关键挑战,重点分析了OCC电路时钟树优化的必要性。通过实战案例,详细阐述了如何通过手动干预、时钟分组与分段长树等策略,避免工具自动平衡导致的时序违例和资源浪费,从而有效实现时钟树平衡并提升设计质量。

weixin_29306261的博客 325

Gromacs空蛋白模拟实战:从PDB文件到动力学轨迹的完整流程解析

本文详细解析了使用Gromacs进行空蛋白分子动力学模拟的完整实战流程。从PDB文件处理、力场选择与拓扑构建,到模拟盒子创建、溶剂化与电荷中和,再到能量最小化、NVT/NPT平衡及最终的生产模拟与基础分析,提供了每一步的命令详解和关键注意事项,旨在帮助计算生物学研究者系统掌握这一核心研究工具。

weixin_28454475的博客 275

Java:Java学习笔记之ReentrantLock的简单理解和使用

ReentrantLock ReentrantLock1、相关知识1.1 公平锁和非公平锁1.2 可重入锁1.3、CAS算法2、背景、定义和特征2.1、背景2.2、定义2.3、特征3、基本结构4、基本使用4.1、解决背景问题4.2、重入锁 使用4.3、公平锁使用5、源码分析5.1、AQS5.2、非公平锁的实现原理5.2.1、lock方法获取锁:tryAcquire5.2.2、锁的释放:tryRelease5.3、公平锁的实现原理5.3.1、lock方法获取锁:tryAcquire5.3.2、锁的释放:try

JMW1407的博客 6990

【推荐100个unity插件】unity易于使用模块化设计的天空、体积云和天气系统——Enviro 3

Enviro 3是一款功能强大的Unity天空与天气系统插件,提供动态天空、体积云、天气模拟等丰富功能。安装时需将预制体拖入场景并配置主相机,URP支持需激活深度纹理和添加渲染特性。模块化设计允许自由添加/移除时间、光照、雾效等模块,并通过API控制参数。推荐配合色调映射(如ACES模式)获得最佳视觉效果。插件支持季节、温湿度模拟及闪电风暴等特效,适用于需要逼真环境渲染的Unity项目。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2092

Java中的ReentrantLock

非公平锁实际执行的效率要远远超出公平锁,除非程序有特殊需要,所能完成的所有工作外,还提供了诸如可响应中断锁、可轮询锁请求、定时锁等避免多线。公平锁指的是锁的分配机制是公平的,通常先对锁提出获取请求的线程会先被分配到锁,在构造函数中提供了是否公平锁的初始化方式来定义公平锁。():尝试获得锁,仅在调用时锁未被线程占用,获得锁。:查询当前线程保持此锁的次数,也就是执行此线程执行。():返回正等待获取此锁的线程估计数,比如启动。按随机、就近原则分配锁的机制则称为不公平锁,: 当前线程是否保持锁锁定,线程的执行。

2301_78008478的博客 242

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

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

我小时候很黑的博客 1938

Python 爬虫实战:社交媒体(Facebook)评论数据抓取与情感分析

在当今数字化时代,社交媒体平台如 Facebook 已成为人们日常生活中不可或缺的一部分。它不仅是人们分享生活点滴、交流思想的场所,也为企业和研究人员提供了丰富的数据资源。通过分析社交媒体上的评论数据,我们可以了解用户的情感倾向、产品反馈以及社会热点话题等。本文将详细介绍如何使用 Python 爬虫技术抓取 Facebook 上的评论数据,并进行情感分析。这不仅是一次技术实战,更是一次数据探索之旅。

yansideyucsdn的博客 671

Java并发之ReentrantLock详解

一、入题        ReentrantLock是Java并发包中互斥锁,它有公平锁和非公平锁两种实现方式,以lock()为例,其使用方式为: ReentrantLock takeLock = new ReentrantLock(); // 获取锁 takeLock.lock(); try { // 业务逻辑 } finally {

辰辰爸的博客 2万+

【MATLAB】工业传送带速度闭环控制与张力联合仿真

本文基于MATLAB/Simulink平台,构建了工业传送带速度闭环控制与张力联合仿真系统。通过搭建驱动模块、机械传动模块、检测模块和控制模块,实现了速度与张力的协同控制。采用双PID调节器分别整定速度与张力参数,经联合调试后系统性能良好:速度跟踪误差小于±0.03m/s,张力波动控制在±30N内,负载扰动恢复时间仅0.3秒。研究提供了从建模到参数优化的完整工程方案,可直接应用于课程设计或工业实践,有效解决了传送带运行中速度偏差与张力波动的协同控制难题。

unber的博客 76

【Java并发】【ReentrantLock】适合初学体质的ReentrantLock入门

马上跟上主播的节奏,看看怎么使用ReentrantLock,这个比较简单,非常适合我们新人朋友奥!本文只介绍简单的使用,具体原理,主播下一篇具体研究🤗是 Java 并发包 () 中的一个类,它实现了Lock接口,提供了与关键字类似的互斥锁功能,但具有更高的灵活性和扩展性。主要特点可重入性与一样,是可重入的。这意味着同一个线程可以多次获取同一个锁,而不会导致死锁。每次获取锁后,必须相应地进行相同次数的释放。公平性支持公平锁和非公平锁。

flzjkl的博客 1091

AgentScope实战训练营:从零搭建一个完整的A2A Agent应用

2024年4月,Google在Google Cloud Next大会上正式提出了A2A(Agent-to-Agent)协议,这是一个开放协议,旨在让不同的AI Agent之间能够像微服务一样相互发现、相互调用。通俗地讲:A2A协议就是AI Agent世界的HTTP协议——有了它,一个Agent可以把自己的能力以标准化的方式暴露出去,另一个Agent可以无缝地发现并调用它。本文将基于阿里巴巴开源的(Apache 2.0协议),手把手带你从零搭建一个完整的A2A Agent应用。

program哲学 563

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

基于ReentrantLock的Java并发编程探索

并发编程是指在计算机系统中,同时执行多个独立的任务或操作的一种编程方式。在现代计算机系统中,利用多核处理器、分布式系统等技术,实现并发性已经成为常态。提高系统性能:通过并发编程,可以充分利用计算资源,同时执行多个任务,提高系统的吞吐量和响应速度。例如,可以将一个大型任务拆分成多个子任务并行执行,加快整体处理速度。提升用户体验:对于需要实时响应的应用程序,如网络服务器、图形界面程序等,采用并发编程可以避免因单线程阻塞而导致的界面卡顿或响应延迟,提升用户体验。资源利用率提高。

q1372302825的博客 1251

pscad IEEE标准系统搭建说明

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

Java ReentrantLock 高并发机制解析

在当今的软件开发领域,高并发编程已成为一项至关重要的技能。特别是在处理多线程应用时,如何有效地管理线程同步和互斥成为了一个核心问题。Java作为一门广泛应用于企业级应用开发的语言,提供了多种机制来支持高并发编程。其中,ReentrantLock是Java并发编程库中的一个重要组成部分,它提供了一种比synchronized关键字更为灵活和强大的锁机制。想象一个在线银行系统,该系统需要处理大量的并发交易请求。在这个系统中,为了保证数据的一致性和完整性,多个线程可能需要同时访问同一份数据。

AIHacksCash的博客 1032

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java并发之ReentrantLock吐血总结

一、ReentrantLock重入锁基本概念 ReentrantLock,重入锁,是JDK5中添加在并发包下的一个高性能的工具。顾名思义,ReentrantLock支持重入功能,即同一个线程在未释放锁的情况下可以重复获取锁,因此,重入的前提必须是同一个线程,后面会基于源码展示重入功能具体是如何实现的。 本文内容将以介绍ReentrantLock的基本功能为主体,辅以相应源码的剖析,使读者深入记...

Slience Wind 650

java 并发——ReentrantLock

java 并发——ReentrantLock 简介 public class ReentrantLock implements Lock, java.io.Serializable { // 继承了 AbstractQueuedSynchronizer 具体操作的执行者 private final Sync sync; abstract static class...

qq_16830879的博客 290

java的reentrantlock_Java并发之ReentrantLock详解

一、入题ReentrantLock是Java并发包中互斥锁,它有公平锁和非公平锁两种实现方式,以lock()为例,其使用方式为:ReentrantLock takeLock = new ReentrantLock();// 获取锁takeLock.lock();try {// 业务逻辑} finally {// 释放锁takeLock.unlock();}那么,ReentrantLock内部是如何...

weixin_35406812的博客 1837

【Java并发编程】ReentrantLock

1. 编程模型 public void some_method() { reentrantlock.lock(); try { //Do some work } catch(Exception e) { e.printStackTrace(); } finally { reentrantlock.unlock(); ...

Penn的博客 170

Java 并发编程详解:Lock 接口及其实现 ReentrantLock

Lock接口 提供了比 synchronized 关键字更灵活和丰富的锁机制。是 Lock 接口的一个实现,支持可重入、可选择的公平锁以及提供 Condition 对象来实现复杂的线程间协调。使用 ReentrantLock 可以提高多线程环境下程序的并发性能和可控性,适用于需要复杂锁控制的场景。通过合理使用 Lock 接口及其实现 ReentrantLock,可以更有效地管理并发,确保线程安全,提高程序的可靠性和性能。

微笑听雨 6026

Java并发编程-ReentrantLock原理

Java并发编程-ReentrantLock原理

wflovejava的博客 311

Java 并发编程之 ReentrantLock

`java.util.concurrent.locks` 包下的 `ReentrantLock` 是 Java 并发编程中一个非常重要的工具,它是一个可重入的互斥锁,功能上类似于 `synchronized` 关键字,但更加灵活和强大。

JiaHao汤 872

Java并发知识之ReentrantLock

深入理解ReentrantLock设计思想和原理

拥抱大数据的专栏 515

java的reentrantlock_Java并发编程锁系列之ReentrantLock对象总结

Java并发编程锁系列之ReentrantLock对象总结在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种。ReentranckLock就是其中的多个分类。本文主要内容:重入锁理解;重入锁代码演示; ReentranckLock的总结本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第四篇:《Java并发包下锁学习第六篇:ReentranckL...

weixin_30036893的博客 203
上一篇: java并发-CAS
下一篇: java并发-ReentrantReadWriteLock
曲终--人散
博客等级 码龄14年 23粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值