ReentrantLock锁相关方法

目录

  • Lock接口的实现类

  • ReentrantLock的方法

  • ReentrantLockTest测试

    • 用于测试的线程

    • t1测试

      • 正确释放重入锁

      • 获取当前的重入次数

    • t1t2测试

      • 使用islocked()方法检测锁状态
    • t1t3测试

      • 使用trylock方法尝试获取锁

      • 使用isHeldByCurrentThread方法检测当前线程是否持有锁

      • 不持有锁时调用unlock方法

    • t1t4测试

      • 使用lockInterruptbly()尝试获取锁

      • 中断因为lockInterruptbly()阻塞的线程

    • t1t2t3t4测试

      • 使用hasQueuedThreads方法检测是否有线程在等待此锁

      • 使用getQueueLength方法检测等待此锁的线程数量

      • 使用hasQueuedThread方法检测指定线程是否在等待此锁

      • 使用isFair检测此锁是否为公平锁

ReentrantLock锁

Lock接口的实现类

ReentrantLock即可重入锁

效果同synchronized关键字

ReentrantLock的方法

public String toString()

返回标识此锁的字符串,以及其锁状态。括号中的状态包括字符串 “Unlocked” 或字符串 “Locked by”,后跟拥有线程的名称。

public int getWaitQueueLength(Condition condition)

返回在与该锁关联的给定条件下等待的线程数的估计值。请注意,由于超时和中断可能随时发生,因此该估计仅用作实际服务员人数的上限。此方法旨在用于监视系统状态,而不是用于同步控制。

public boolean hasWaiters(Condition condition)

查询是否有任何线程正在等待与此锁关联的给定条件。请注意,由于超时和中断可能随时发生,因此真实的返回并不能保证将来的信号会唤醒任何线程。此方法主要设计用于监视系统状态。

public final boolean hasQueuedThread(Thread thread)

查询给定线程是否正在等待获取此锁。请注意,由于取消可能随时发生,因此真正的返回并不能保证该线程将永远获得此锁。此方法主要设计用于监视系统状态。

public final int getQueueLength()

返回等待获取此锁的线程数的估计值。该值只是一个估计值,因为在该方法遍历内部数据结构时,线程数可能会动态变化。此方法旨在用于监视系统状态,而不是用于同步控制。

public final boolean hasQueuedThreads()

查询是否有任何线程在等待获取此锁。请注意,由于取消可能随时发生,因此真正的返回并不能保证任何其他线程都将获得此锁。此方法主要设计用于监视系统状态。

public final boolean isFair()

如果此锁的公平设置为true,则返回true

public boolean isLocked()

查询此锁是否由任何线程持有。此方法旨在用于监视系统状态,而不是用于同步控制。

public int getHoldCount()

查询当前线程对此锁的保留数。
线程对每个锁定动作都有一个锁定,而解锁动作不匹配。

public boolean isHeldByCurrentThread()

查询此锁是否由当前线程持有。
类似于内置监视器锁的Thread.holdsLock(Object) 方法,该方法通常用于调试和测试。

public ReentrantLock()

创建ReentrantLock的实例。这相当于使用ReentrantLock(false)。

public ReentrantLock(boolean fair)

使用给定的公平策略创建ReentrantLock实例。(true表示公平锁策略)

ReentrantLockTest测试

用于测试的线程

Thread t1 = new Thread(() -> {for (int i = 0; i < 2; i++) {try {lock.lock();System.out.println("t1获取锁:lock.lock()");lock.lock();//每次循环重复获取锁2次System.out.println("t1获取锁:lock.lock()");} finally {System.out.println("t1释放锁:lock.unlock()");lock.unlock();//每次循环只释放一次锁}}System.out.println("t1当前对lock的获取次数:" + lock.getHoldCount());});Thread t2 = new Thread(() -> {try {System.out.println("t2线程 lock.lock()");lock.lock();System.out.println("t2获取到锁:lock");} finally {lock.unlock();}});Thread t3 = new Thread(() -> {try {System.out.println("t3使用trylock()尝试获取锁");if (lock.tryLock())System.out.println("t3线程获取了锁");elseSystem.out.println("t3获取锁失败");} finally {if (lock.isHeldByCurrentThread())lock.unlock();elseSystem.out.println("t3没有获取到锁 不需要执行unlock()");}});Thread t4 = new Thread(() -> {try {System.out.println("t4使用lockInterruptibly()尝试获取锁");lock.lockInterruptibly();System.out.println("t4获取到了锁");} catch (InterruptedException e) {System.out.println("t4在等待lock释放时被中断");e.printStackTrace();} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();} else {System.out.println("t4没有获取到锁 不需要执行unlock()");}}});

t1测试

System.out.println("\nt1线程启动");t1.start();Thread.sleep(100);

在这里插入图片描述

正确释放重入锁

t1线程此时并没有释放锁
ReentrantLock的机制为:

如果一个线程获取了此锁
则可以在后续多次重复获取
但也需要相同次数的释放
才能正确的释放锁

获取当前的重入次数

t1线程获取锁共4次
释放锁2次
剩余2次获取没有释放

在线程循环外通过lock.getHoldCount()得到了线程t1对lock的重入次数

t1t2测试

        System.out.println("\nt1线程启动");t1.start();Thread.sleep(100);System.out.println(lock.isLocked());System.out.println("\nt2线程启动");t2.start();Thread.sleep(100);

在这里插入图片描述

使用islocked()方法检测锁状态

如果锁已经被某个线程获取
islocked方法返回true
否则返回false

因为线程t1没有正确释放重入锁 t2没有获取到锁

t1t3测试

System.out.println("\nt1线程启动");t1.start();Thread.sleep(100);
System.out.println("\nt3线程启动");t3.start();Thread.sleep(100);

在这里插入图片描述

使用trylock方法尝试获取锁

trylock尝试获取锁
如果获取成功 返回true
如果获取失败 返回false 且不会阻塞等待锁释放

使用isHeldByCurrentThread方法检测当前线程是否持有锁

如果当前线程持有此锁返回true
如果当前线程不持有锁返回false

不持有锁时调用unlock方法

如果线程在没有获取到此锁的情况下使用了此锁unlock方法
会抛出illegalMonitorStateException

t3中
在释放锁之前使用isHeldByCurrentThread检测
避免在不持有锁时释放锁

t1t4测试

        System.out.println("\nt1线程启动");t1.start();Thread.sleep(100);System.out.println("\nt4线程启动");t4.start();Thread.sleep(100);t4.interruput();

在这里插入图片描述

使用lockInterruptbly()尝试获取锁

当获取成功 效果同lock()
当获取失败 阻塞等待锁释放 但此线程在阻塞期间可以响应中断

中断因为lockInterruptbly()阻塞的线程

当线程因为lockInterruptbly()阻塞时
如果收到中断请求
会抛出interruptedException

效果同sleep wait期间收到中断请求
可以捕获异常进行中断处理

t1t2t3t4测试

System.out.println("\nt1线程启动");t1.start();Thread.sleep(100);System.out.println("\nt2线程启动");t2.start();Thread.sleep(100);System.out.println("\nt3线程启动");t3.start();Thread.sleep(100);System.out.println("\nt4线程启动");t4.start();Thread.sleep(100);System.out.println("\nlock锁的检测方法:");System.out.println("是否有线程在等待lock锁:"+lock.hasQueuedThreads());System.out.println("有多少线程在等待lock锁:"+lock.getQueueLength());System.out.println("t2线程是否在等待lock锁:"+lock.hasQueuedThread(t2));System.out.println("lock是否为公平锁:"+lock.isFair());

在这里插入图片描述

使用hasQueuedThreads方法检测是否有线程在等待此锁

如果返回true说明有线程在等待此锁
否则返回false

使用getQueueLength方法检测等待此锁的线程数量

返回的整数代表等待此锁的线程数量
此处t2 t4线程在等待锁
t3线程使用trylock()没有获取到锁 已经执行else路径的代码退出 没有阻塞等待lock释放

使用hasQueuedThread方法检测指定线程是否在等待此锁

如果返回true 代表此线程正在等待此锁释放
如果返回false代表此线程没在等待此锁

使用isFair检测此锁是否为公平锁

如果返回true 代表此锁是公平锁
如果返回false代表此锁不是公平锁

公平锁即 请求获取此锁的线程按请求顺序依次获得锁
非公平锁即 所有请求获取此锁的线程随机竞争

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36539.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReentrantLock详解

目录 一、ReentrantLock的含义 二、RerntrantLock当中的常用方法 ①lock()和unlock()方法 ②构造方法 ③tryLock()方法 tryLock()无参数 tryLock(timeout,Times)有参数 ④lockInterruptibly() throws InterruotedException 经典面试问题: ReentrantLock和synchronized有什…

OpenAI最新官方ChatGPT聊天插件接口《智能聊天插件引言》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(一)(附源码)

Chat Plugins Limited Alpha 聊天插件 前言IntroductionPlugin flow 插件流其它资料下载 Learn how to build a plugin that allows ChatGPT to intelligently call your API. 了解如何构建允许ChatGPT智能调用API的插件。 前言 在现代的软件开发环境中&#xff0c;使用第三方…

Pycharm快速入门(10) — 插件管理

1、插件安装 File | Settings | Plugins | Marketplace 搜索插件点击Install安装 2、插件卸载 File | Settings | Plugins | Installed 选择需要卸载的插件&#xff0c;点击Uninstall。 3、推荐插件 &#xff08;1&#xff09;、Chinese ​(Simplified)​ Language Pack &am…

chatgpt赋能python:Python编程的好玩之处:用简单的代码创造奇妙的世界

Python编程的好玩之处&#xff1a;用简单的代码创造奇妙的世界 如果你喜欢写代码&#xff0c;那么Python是一个不错的选择。Python语言设计简单&#xff0c;易学易用&#xff0c;同时还拥有丰富的生态系统&#xff0c;支持许多强大的第三方库和框架&#xff0c;可以使你轻松地…

chatgpt赋能python:Python图片拼图的好处和应用

Python图片拼图的好处和应用 Python是一种高级编程语言&#xff0c;已经被广泛应用于数据科学、网络编程、机器学习等领域。其中&#xff0c;Python的图像处理领域也越来越受关注。在本文中&#xff0c;我们将介绍如何使用Python创建图片拼图&#xff0c;并讨论它的好处和应用…

midjourney教程:如何快速生成个性化Logo设计

midjourney是一款基于人工智能技术的Logo设计工具&#xff0c;它可以帮助用户快速生成个性化的Logo设计&#xff0c;而无需具备专业的设计技能。下面将为大家介绍midjourney的使用方法&#xff0c;以帮助大家轻松生成符合自己需求的Logo设计。 第一步&#xff1a;登录midjourn…

chatgpt赋能python:Python添加图片背景的方法

Python添加图片背景的方法 简介 Python是一种开源的高级编程语言&#xff0c;广泛应用于各个行业中&#xff0c;包括图像处理。添加图片背景是图像处理中的常见需求&#xff0c;通过Python可以很方便地实现。 本篇文章将介绍如何使用Python来给图片添加背景&#xff0c;让您…

chatgpt赋能python:Python怎么做图形

Python怎么做图形 在数据可视化和图像处理方面&#xff0c;Python已经成为了最受欢迎的编程语言之一。Python的图形库使得创建各种图形和图表、可视化工具和图像处理应用程序变得容易而简单。 在本文中&#xff0c;我们将会介绍一些最受欢迎的Python图形库&#xff0c;以帮助…

程序员晒追女神聊天截图,坦言第一次没经验,网友直呼凭实力单身

前段时间网络上一名程序员晒出了自己与女神之间的聊天记录的对话截图&#xff0c;通过截图中我们可以看出&#xff0c;应该是这位程序员在追求这位女神&#xff0c;但是短短的十几分钟几条聊天记录&#xff0c;却以女神不再愿意搭理程序员结束&#xff0c;对于这样的结局&#…

程序员给女友4千生活费,收到女友错发信息后分手,神对话!

如何平衡好亲情爱情的关系&#xff0c;是一门学问&#xff0c;有的人就希望自己的另一半过好他们自己的小日子&#xff0c;不要对家里的事情过多的付出&#xff0c;但有人觉得自己父母养大自己不容易&#xff0c;能有能力的话&#xff0c;不光孝敬爹妈&#xff0c;还会帮衬家里…

程序员就是这样聊天把女朋友聊没的

身为程序员 都想当然的认为 身为一个优秀的程序员 我怎么可能会没女票 这不科学啊 工资高&#xff0c;话少 有一天看到了 某个程序员的聊天记录 有女孩主动搭讪 这么绝好的机会 然后你竟然说忙 说忙 忙... 主动找你搭讪 你还不抓紧机会约约约 如果改成&#xff1a…

被程序员的相亲规划整不会了......

近日&#xff0c;北京一程序员将自己7天7场相亲行程规划表发到论坛分享&#xff0c;感叹到&#xff1a;真不是凡尔赛&#xff0c;相亲比上班还难&#xff0c;引来大量网友围观。 相亲也有规划表&#xff1f; 据介绍&#xff0c;该程序员今年刚好30岁&#xff0c;自己平时加班多…

程序员吐槽女朋友狮子大开口

本文转载自程序员八卦 一个程序员发帖吐槽自己的潮汕女朋友&#xff0c;开口要彩礼18万8&#xff0c;楼主在网上查了一下&#xff0c;一般潮汕彩礼是3万到8万&#xff0c;难道外地人要多给一点吗&#xff1f;而且女朋友还一定要楼主父母出彩礼&#xff0c;不能楼主自己出&…

最最普通程序员,如何利用工资攒够彩礼,成为人生赢家

今天我们不讲如何提升你的专业技能去涨工资&#xff0c;不讲面试技巧如何跳槽涨工资&#xff0c;不讲如何干兼职赚人生第一桶金&#xff0c;就讲一个最最普通的程序员&#xff0c;如何在工作几年后&#xff0c;可以攒够彩礼钱&#xff0c;婚礼酒席钱&#xff0c;在自己人生大事…

如何做好小红书?从找好定位开始,这篇文章告诉你

近年来小红书随着用户体量壮大和平台多元化发展&#xff0c;用户的兴趣点&#xff0c;早已从美妆独大变为渗透生活领域的各个方面。与以往相比&#xff0c;大家对小红书的认知也逐渐在发生变化。 如果说去年还有不少商家还经常问我们“为什么要做小红书&#xff1f;”。那么&am…

测试听力口语软件,上、英语系学姐最全整理的34个英语学习App 针对听力、口语、阅读...

英语的重要性不用我多说啦~日常生活、工作&#xff0c;不擅长英语真的会失去很多机会和乐趣 作为英语系学姐今天就给大家总结了一些学习英语的app 有需要就马住&#xff0c;慢慢学习&#xff01; 听力 听力学习&#xff0c;都非常好用 -朗易思听 页面超精美&#xff0c;资源也很…

小红书怎么运营好?分享小红书的一些经验让你少走弯路

每次讲小红书运营&#xff0c;我都尽量把一个问题拆的特别细&#xff0c;揉碎了讲&#xff0c;说实话挺不容易的。之前也发过&#xff0c;这次分享又是小红书&#xff0c;没办法&#xff0c;小红书的流量非常大&#xff0c;而且粉丝精准度也很不错。 分享的这些都是经验&#…

chatgpt赋能python:Python手机密码解锁-打开手机的一条捷径

Python手机密码解锁-打开手机的一条捷径 我们都遇到过忘记手机密码的经历。不管是因为长时间不用手机导致遗忘&#xff0c;还是输入错误太多次&#xff0c;导致手机被锁定&#xff0c;让我们感到非常困扰和苦恼。虽然我们可以通过向手机厂商寻求帮助或找专业维修技术人员来解锁…

16个小的UI设计规则却能产生巨大的影响

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的&#xff0c;我们出的钱 体验地…

每个前端开发者都应知道的25个实用网站

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的&#xff0c;我们出的钱 体验地…