JAVA多线程高并发之ReentrantLock讲解lockInterruptibly方法

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

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 调用lockInterruptibly方法,可以对线程interrupt方法做成响应

package com.reentranlock;

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

/**
 * ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做成响应
 *
 * @author 小辉哥/小辉GE
 * <p>
 * 2019年8月10日 下午15:30:00
 */
public class ReentrantLockInterrupt {

	public static void main(String[] args) {
		Lock lock = new ReentrantLock();
		Thread thread1 = new Thread(() -> {
			lock.lock();
			try {
				System.out.println("thread1 start......");
				TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
			} catch (InterruptedException e) {
				System.out.println("thread1" + "interrupt......");
			} finally {
				lock.unlock();
				System.out.println("thread1 end......");
			}
		});
		thread1.start();

		Thread thread2 = new Thread(() -> {
			boolean status = false;
			try {
				status = lock.tryLock();
				System.out.println("thread2 start......");
				// 可以对interrupt方法做出响应
				if (!status)
					lock.lockInterruptibly();
			} catch (InterruptedException e) {
				System.out.println("thread2" + "interrupt");
			} finally {
				if (status)
					lock.unlock();
				System.out.println("thread2 end");
			}
		});
		thread2.start();

		try {
			TimeUnit.SECONDS.sleep(5);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		thread2.interrupt();
	}

}

测试输出结果如下:

结果分析:

thread1 和 thread2两个线程启动,thread1 sleep很久,thread2调用lockInterruptibly方法,可以对线程interrupt方法做成响应,直接结束。这就是ReentrantLock可以对等待的线程进行打断,很强悍吧。

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

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

 

【Java多线程】ReentrantLock ReentrantLock 在实现线程同步时,大多情况下使用的是Synchronized关键字实现,但是Synchronized的锁太过封闭,获得锁和释放锁都是系统自动的。所以为了更灵活的操作,在JDK1.5版本之后,就诞生了Lock接口以及其实现类。 lock接口也是对资源上锁的一种工具,它不同于Synchronized的隐式上锁与解锁,lock接口中的获取锁和释放锁,是需要手动去操作的。 Synchronized关键字的同步代码出现以下三种情况才会释放锁: 1、同步代码块执行完成,自动释放锁。 2、同 阅读详情

相关推荐

Java面试篇基础部分-ReentrantLock详解(二)

ReentrantLock 通过在构造函数public ReentrantLock(boolean fair) 中传递不同的参数来定义不同的锁,默认实现的是非公平锁。这是因为,非公平锁虽然放弃了锁的公平性,但是他的执行效率要比公平锁要高。如果没有特殊的要求建议使用非公平锁。ReentrantLock 支持公平锁与非公平锁的两种方式;公平锁是指锁的分配和竞争机制是公平的,也就是说先到先得。非公平锁是指JVM遵循随机、就近原则来进行锁的分配。

初学者 1900

Lock的lockInterruptibly()方法

lockInterruptibly()方法能够中断等待获取锁的线程。当两个线程同时通过lock.lockInterruptibly()获取某个锁时,假若此时线程A获取到了锁,而线程B只有等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程。 示例: 要执行doBussiness()中的代码首先需要得到锁lock,线程使用lockInterruptibly()...

az44yao的专栏 1万+

多线程 - lock、tryLock、lockInterruptibly有什么区别?以及使用案例

【lock、tryLock、lockInterruptibly有什么区别?以及使用案例】

学无止境 1345

【并发编程】ReentrantLock的lockInterruptibly()方法源码分析

ReentrantLock的lockInterruptibly()方法源码分析。带你详细分析支持线程中断的加锁方法原理。 ockInterruptibly()支持线程中断,它与lock()方法的主要区别在于lockInterruptibly()获取锁的时候如果线程中断了,会抛出一个异常,而lock()不会管线程是否中断都会一直尝试获取锁,获取锁之后把自己标记为已中断,继续执行自己的逻辑,后面也会正常释放锁。.........

小七的博客 2052

lock、tryLock、lockInterruptibly有什么区别?

【代码】lock、tryLock、lockInterruptibly有什么区别?

学无止境 613

PCIE协议版--M.2接口规范V1.0中文版1——物理规格篇

5.1.3.双模块键模块:同时支持Socket1-DP、Socket1-SD。2.4.7.3.3.双面模块(使用H2.8、H3.2、H4.2连接器)6.5.8.2.5.热设计功率响应-带有风扇类别的薄平台笔记本电脑。2.3.7.1. Socket1&2射频连接器PIN-OUT。5.2.2.Socket2 PIN-OUT(机械KEY B)3.2.10.1.3.极薄的笔记本电脑的电源开关顺序的例子。5.1.1.Socket1-DP(机械KEY A)5.1.2.Socket1-SD(机械KEY E)

想你所想,做你所做 4677

Java内置锁:深度解析Lock接口中lock方法和lockInterruptibly方法

Java11中的Lock接口提供lock()和lockInterruptibly()两种锁定方法,用于获取锁,但处理线程中断时有所不同,lock()使线程等待直到锁释放,期间无视中断;而lockInterruptibly()在等待中若收到中断请求,会立即响应并抛出异常,这种机制使lockInterruptibly()更灵活,能更好处理线程中断,避免无意义等待,提升系统响应性和效率。

科技互联网领域深度探索者,乐于分享与写作。 3037

GIS坐标系转换以及空间校正和地理配准

许多小伙伴都对坐标系,投影这类问题迷迷糊糊,我之前也一样,现在总结一下。 坐标系的转换1.为什么要进行坐标系的转换?2. 不同坐标系的介绍1.地理坐标系我国常见的地理坐标(1).北京54坐标系(2).西安80坐标系(3).WGS-84坐标系(4).大地2000坐标系2.投影坐标系我国常用的投影坐标系(1) UTM投影(2) 高斯-克吕格投影(3) 兰伯特投影(4) 阿尔伯斯投影投影坐标系的选择3. 坐标系的转换1.已知坐标系之间的转换1.1 两坐标系的参考椭球相同1.2 两坐标系的参考椭球不一致,但是GIS

m0_47258611的博客 8912

ReentrantLock中lock(),tryLock(),lockInterruptibly()的区别

lock() 两个线程都使用lock获取锁,如果线程A获取到了锁,线程B只能等待,对线程B调用interrupt()方法不能中断线程B的等待过程。 tryLock() 使用lock获取锁,如果线程A获取到了锁,线程A返回true,线程B直接返回false。可以传入时间参数,表示拿不到锁等待一段时间,这段时间内还是拿不到就返回false。 lockInterruptibly() 两个线程都使用lockInterruptibly获取锁,如果线程A获取到了锁,线程B只能等待,对线程B调用interrupt()方法

tc979907461的博客 4697

Anaconda下安装LabelImg

Anaconda下安装LabelImg

LYH8543的博客 756

华为od 面试八股文_JAVA语言_01_含答案

华为od 面试八股文_JAVA语言_01_含答案

MISAYAONE的博客 4304

【代码】使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应

import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应, * ...

学亮编程手记 651

【AI智能体】全场景AI智能体工作台WorkBuddy实战操作详解

全场景AI智能体工作台WorkBuddy实战操作详解

congge 5487

Java——多线程高并发系列之Lock、ReentrantLock

Java——多线程高并发系列之Lock、ReentrantLock

贝尔摩德苦艾酒 7737

第201期 解锁科研效率新高度:Claude 科学技能插件(claude-scientific-skills)深度体验

科研AI助手Claude Scientific Skills开源工具为Claude大模型扩展科学能力,覆盖数据可视化、数学计算、学术格式处理等科研全流程需求。该插件支持LaTeX公式生成、自动化科研图表绘制、学术文档规范校正等功能,让研究人员通过自然语言指令即可完成专业任务。项目开源可定制,支持特定学科需求扩展,目前已托管于GitHub。使用门槛低,只需配置Claude API密钥即可快速启用,帮助科研人员从繁琐技术细节中解放,聚焦核心研究创新。

全网120W+关注AI拉呱,专注人工智能以及科技前沿! 1357

【R语言】基于Biomod2集成平台探究物种分布区的构建流程(SDMs)

我为什么想要写这个内容呢?其实我已经想了很久了,但是一直没有把所有的代码给理清楚,此外这将是我之后研究的主要方向。本博客讲述了如何基于Biomod2集成平台构建物种分布模型的全流程,以及我在使用该模型时的一些心得,同时还有我提供的一些小福利(一键处理代码),可以十分快捷的帮助你完成SDMs的构建,写出你的中英文论文。

amyniez的博客,欢迎交流讨论 3889

Java多线程--ReentrantLock的lock和lockInterruptibly的区别

ReentrantLock的加锁方法Lock()提供了无条件地轮询获取锁的方式,lockInterruptibly()提供了可中断的锁获取方式。这两个方法的区别在哪里呢?通过分析源码可以知道lock方法默认处理了中断请求,一旦监测到中断状态,则中断当前线程;而lockInterruptibly()则直接抛出中断异常,由上层调用者区去处理中断。      1  lock操作         lock...

weixin_41704428的博客 631

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

lock 线程 java_Java多线程:lockInterruptibly()方法

Java多线程:lockInterruptibly()方法lockInterruptibly() 方法的作用:如果当前线程未被中断则获得锁,如果当前线程被中断则出现异常。package com.wkcto.lock.reentrant;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.Reentrant...

weixin_30854435的博客 901

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java多线程 ReentrantLock锁的使用 lock()、tryLock()、lockInterruptibly()

java基础(jdk1.8) ** 多线程—ReentrantLock使用 ** 此篇博客主要讲如何使用ReentrantLock 本篇链接 文章目录多线程—ReentrantLock使用ReentrantLock的简介方法公平锁与synchronized比较 ReentrantLock的简介 ReentrantLock是Java的一个类 底层使用CAS ReentrantLock锁可以代替synchronized,而且控制更加方便 但线程数小于等于2的时候(简单模型)使用synchronized 方法

qq_43360780的博客 763

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java并发专题-谈谈ReentrantLock的lockInterruptibly方法

lockInterruptibly方法是说线程在等待获取锁的同时还能响应线程interrupt方法的中断请求。换句话说就是存在等待获取锁的同时还不能响应线程interrupt方法的中断请求的情况,synchronized内置锁便是,请看测试代码: public class LockInter...

chengli6223的博客 322

ReentrantLock的lock和lockInterruptibly

允许在等待时由其他线程的Thread.interrupt()方法来中断等待线程 lockInterruptibly 与 lock比较区别在于lockInterruptibly 优先考虑响应中断,也就是说在lock.lockInterruptibly();之后的代码不会执行,直接就被异常捕获了。 而lock.lock();则是会一直到调用sleep函数后才响应,sleep函数之前的代码会照常...

Super_Jadroid的博客 628

lock()与lockInterruptibly()的区别

lock 与 lockInterruptibly比较区别在于: lock 优先考虑获取锁,待获取锁成功后,才响应中断。 lockInterruptibly 优先考虑响应中断,而不是响应锁的普通获取或重入获取。 详细区别: ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,

杨煜冬煜杨的博客 3万+

多线程-lock与lockInterruptibly的区别

中断响应lock方法:不响应中断,线程会一直尝试获取锁,直到成功为止。方法:响应中断,线程在检测到中断后会抛出并停止尝试获取锁。使用场景lock方法适用于不需要考虑中断的场景。方法适用于需要及时响应中断的场景,例如当需要能够中断线程来避免死锁时。

Java领域优秀创作者 1769

ReentrantLock-lockInterruptibly,lock,tryLock区别

lockInterruptibly 与 lock比较区别在于 lockInterruptibly 优先考虑响应中断,而不是响应锁定的普通获取或重入获取 Java代码 收藏代码 package test; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.co...

juezhu0193的博客 202

ReentrantLock的lock(), tryLock(), lockInterruptibly() 及使用场景示例

文章目录总述1.ReentrantLock简要介绍2.ReentrantLock提供的获取锁的方式2.1 lock()2.2 tryLock()2.3 tryLock(long timeout, TimeUnit unit)2.4 lockInterruptibly()3.使用场景示例3.1 对于tryLock()的测试3.2 tryLock(long,TimeUnit),3.3 tryLock(...

weixin_42030357的博客 2646
上一篇: JAVA多线程高并发之ReentrantLock讲解lock/unlock/tryLock方法
下一篇: JAVA多线程高并发之ReentrantLock讲解公平锁
饶艳辉
博客等级 码龄15年 20粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值