lock lockJava中Lock,tryLock,lockInterruptibly有什么区别

lock lock  时间:2022-03-01  阅读:()

Java中Lock,tryLock,lockInterruptibly有什么区别

ReentrantLock 锁有好几种,除了常用的lock ,tryLock ,其中有个lockInterruptibly 。 先把API粘贴上来 lock public void lock() 获取锁。 如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1。 如果当前线程已经保持该锁,则将保持计数加 1,并且该方法立即返回。 如果该锁被另一个线程保持,则出于线程调度的目的,禁用当前线程,并且在获得锁之前,该线程将一 直处于休眠状态,此时锁保持计数被设置为 1。 指定者: 接口 Lock 中的 lock lockInterruptibly public void lockInterruptibly() throws InterruptedException 1)如果当前线程未被中断,则获取锁。 2)如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1。 3)如果当前线程已经保持此锁,则将保持计数加 1,并且该方法立即返回。 4)如果锁被另一个线程保持,则出于线程调度目的,禁用当前线程,并且在发生以下两种情况之一以 前,该线程将一直处于休眠状态: ? ? 1)锁由当前线程获得;或者 ? ? 2)其他某个线程中断当前线程。 5)如果当前线程获得该锁,则将锁保持计数设置为 1。 ? 如果当前线程: ? ? ? 1)在进入此方法时已经设置了该线程的中断状态;或者 ? ? ? 2)在等待获取锁的同时被中断。 ? 则抛出 InterruptedException,并且清除当前线程的已中断状态。 6)在此实现中,因为此方法是一个显式中断点,所以要优先考虑响应中断,而不是响应锁的普通获取或 重入获取。 指定者: 接口 Lock 中的 lockInterruptibly 抛出: ? InterruptedException ? 如果当前线程已中断。 tryLock ? ?public boolean tryLock() 仅在调用时锁未被另一个线程保持的情况下,才获取该锁。 1)如果该锁没有被另一个线程保持,并且立即返回 true 值,则将锁的保持计数设置为 1。 即使已将此锁设置为使用公平排序策略,但是调用 tryLock() 仍将 立即获取锁(如果有可用的), 而不管其他线程当前是否正在等待该锁。在某些情况下,此“闯入”行为可能很有用,即使它会打破公 平性也如此。如果希望遵守此锁的公平设置,则使用 tryLock(0, TimeUnit.SECONDS) ,它几乎是等效的(也检测中断)。 2)如果当前线程已经保持此锁,则将保持计数加 1,该方法将返回 true。 3)如果锁被另一个线程保持,则此方法将立即返回 false 值。 指定者: ? 接口 Lock 中的 ?tryLock 返回: ? 如果锁是自由的并且被当前线程获取,或者当前线程已经保持该锁,则返回 true;否则返回 false 关于中断又是一段很长的叙述,先不谈。 1)lock(), 拿不到lock就不罢休,不然线程就一直block。 比较无赖的做法。 2)tryLock(),马上返回,拿到lock就返回true,不然返回false。 比较潇洒的做法。 ? ?带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false。比较聪明的做法。 3)lockInterruptibly()就稍微难理解一些。 先说说线程的打扰机制,每个线程都有一个 打扰 标志。这里分两种情况, 1. 线程在sleep或wait,join, 此时如果别的进程调用此进程的 interrupt()方法,此线程会被唤醒并被要求处理InterruptedException;(thread在做IO操作时也可能有类似行为,见java thread api) 2. 此线程在运行中, 则不会收到提醒。但是 此线程的 “打扰标志”会被设置, 可以通过isInterrupted()查看并 作出处理。 lockInterruptibly()和上面的第一种情况是一样的, 线程在请求lock并被阻塞时,如果被interrupt,则“此线程会被唤醒并被要求处理InterruptedException”。并且如果线程已经被interrupt,再使用lockInterruptibly的时候,此线程也会被要求处理interruptedException 先看lock()方法 import?java.util.concurrent.locks.Lock; import?java.util.concurrent.locks.ReentrantLock; /** ?*?@author?作者?E-mail: ?*?@version?创建时间:2015-10-23?下午01:47:03?类说明 ?*/ public?class?TestLock { ????//?@Test ????public?void?test()?throws?Exception ????{ ????????final?Lock?lock?=?new?ReentrantLock(); ????????lock.lock(); ????????Thread?t1?=?new?Thread(new?Runnable() ????????{ ????????????@Override ????????????public?void?run() ????????????{ ????????????????lock.lock(); ????????????????System.out.println(Thread.currentThread().getName()?+?"?interrupted."); ????????????} ????????},"child?thread?-1"); ????????t1.start(); ????????Thread.sleep(1000); ????????t1.interrupt(); ????????Thread.sleep(1000000); ????} ????public?static?void?main(String[]?args)?throws?Exception ????{ ????????new?TestLock().test(); ????} } 用eclipse对这个程序进行debug发现,即使子线程已经被打断,但是子线程仍然在run,可见lock()方法并不关心线程是否被打断,甚至说主线程已经运行完毕,子线程仍然在block(). 而使用LockInterupptibly,则会响应中断 import?java.util.concurrent.locks.Lock; import?java.util.concurrent.locks.ReentrantLock; /** ?*?@author?作者?E-mail: ?*?@version?创建时间:2015-10-23?下午01:53:10?类说明 ?*/ public?class?TestLockInterruptibly { ????//?@Test ????public?void?test3()?throws?Exception ????{ ????????final?Lock?lock?=?new?ReentrantLock(); ????????lock.lock(); ????????Thread?t1?=?new?Thread(new?Runnable() ????????{ ????????????@Override ????????????public?void?run() ????????????{ ????????????????try ????????????????{ ????????????????????lock.lockInterruptibly(); ????????????????} ????????????????catch(InterruptedException?e) ????????????????{ ????????????????????System.out.println(Thread.currentThread().getName()?+?"?interrupted."); ????????????????} ????????????} ????????},?"child?thread?-1"); ????????t1.start(); ????????Thread.sleep(1000); ????????t1.interrupt(); ????????Thread.sleep(1000000); ????} ????public?static?void?main(String[]?args)?throws?Exception ????{ ????????new?TestLockInterruptibly().test3(); ????} } try{ ? ? ?Thread.sleep(2000); ? ? ?lock.lockInterruptibly(); ? }catch(InterruptedException e){ ? ? ? System.out.println(Thread.currentThread().getName()+" interrupted."); } ?t1.start(); ?t1.interrupt(); ?Thread.sleep(1000000); 如果将代码改成这样,那么将会在在阻塞之前已经中断,此时再lockInterruptibly()也是会相应中断异常的

Hostodo独立日提供四款特价年付VPS套餐 最低年付$13.99

前天,还有在"Hostodo商家提供两款大流量美国VPS主机 可选拉斯维加斯和迈阿密"文章中提到有提供两款流量较大的套餐,这里今天看到有发布四款庆祝独立日的七月份的活动,最低年付VPS主机13.99美元,如果有需要年付便宜VPS主机的可以选择商家。目前,Hostodo机房可选拉斯维加斯和迈阿密两个数据中心,且都是基于KVM虚拟+NVMe整列,年付送DirectAdmin授权,需要发工单申请。(如何...

2021年7月最新洛杉矶CN2/香港CN2 vps套餐及搬瓦工优惠码 循环终身优惠6.58%

搬瓦工怎么样?2021年7月最新vps套餐推荐及搬瓦工优惠码整理,搬瓦工优惠码可以在购买的时候获取一些优惠,一般来说力度都在 6% 左右。本文整理一下 2021 年 7 月最新的搬瓦工优惠码,目前折扣力度最大是 6.58%,并且是循环折扣,续费有效,可以一直享受优惠价格续费的。搬瓦工优惠码基本上可能每年才会更新一次,大家可以收藏本文,会保持搬瓦工最新优惠码更新的。点击进入:搬瓦工最新官方网站搬瓦工...

LightNode(7.71美元),免认证高质量香港CN2 GIA

LightNode是一家位于香港的VPS服务商.提供基于KVM虚拟化技术的VPS.在提供全球常见节点的同时,还具备东南亚地区、中国香港等边缘节点.满足开发者建站,游戏应用,外贸电商等应用场景的需求。新用户注册充值就送,最高可获得20美元的奖励金!成为LightNode的注册用户后,还可以获得属于自己的邀请链接。通过你的邀请链接带来的注册用户,你将直接获得该用户的消费的10%返佣,永久有效!平台目前...

lock lock为你推荐
文件下载在电脑上下载文件怎么下载活跃网络移动大V网是什么意思?快照优化网站快照优化需要注意什么gps简介GPS代表什么含义?我的电脑打开很慢电脑开机为什么总是那么慢啊?宴请网宴请食谱大全,宴请吃什么,宴请食硬盘文件不显示电脑硬盘文件找不到了怎么办?跨境电商开发跨境电商平台中卖家产品开发技巧有哪些电商运营学习学电商运营以后可以干什么网络安全工程师要求信息安全工程师的那个考试条件
香港服务器租用 浙江vps 草根过期域名 香港vps99idc adman vps.net cve-2014-6271 国外服务器网站 河南移动m值兑换 重庆双线服务器托管 四核服务器 linode支付宝 英国伦敦 个人免费邮箱 免费网络空间 服务器是什么意思 超低价 在线tracert dbank 戴尔主机 更多