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()也是会相应中断异常的

标准互联(450元)襄阳电信100G防御服务器 10M独立带宽

目前在标准互联这边有两台香港云服务器产品,这不看到有通知到期提醒才关注到。平时我还是很少去登录这个服务商的,这个服务商最近一年的促销信息比较少,这个和他们的运营策略有关系。已经从开始的倾向低价和个人用户云服务器市场,开始转型到中高端个人和企业用户的独立服务器。在这篇文章中,有看到标准互联有推出襄阳电信高防服务器100GB防御。有三款促销方案我们有需要可以看看。我们看看几款方案配置。型号内存硬盘IP...

木木云35元/月,美国vps服务器优惠,1核1G/500M带宽/1T硬盘/4T流量

木木云怎么样?木木云品牌成立于18年,此为贵州木木云科技有限公司旗下新运营高端的服务器的平台,目前已上线美国中部大盘鸡,母鸡采用E5-267X系列,硬盘全部组成阵列。目前,木木云美国vps进行了优惠促销,1核1G/500M带宽/1T硬盘/4T流量,仅35元/月。点击进入:木木云官方网站地址木木云优惠码:提供了一个您专用的优惠码: yuntue目前我们有如下产品套餐:DV型 1H 1G 500M带宽...

Digital-VM:服务器,$80/月;挪威/丹麦英国/Digital-VM:日本/新加坡/digital-vm:日本VPS仅$2.4/月

digital-vm怎么样?digital-vm在今年1月份就新增了日本、新加坡独立服务器业务,但是不知为何,期间终止了销售日本服务器和新加坡服务器,今天无意中在webhostingtalk论坛看到Digital-VM在发日本和新加坡独立服务器销售信息。服务器硬件是 Supermicro、采用最新一代 Intel CPU、DDR4 RAM 和 Enterprise Samsung SSD内存,默认...

lock lock为你推荐
fast路由器路由器fast怎么设置无线网络文件损坏安装软件显示文件已损坏怎么回事光纤是什么光纤是什么网络限速软件谁有网络限速的软件,路由器。很卡~别人一看电影什么都干不了。提供个限速的软件。下载成功给分!乐辞乐的组词有什么主板说明书精英主板中文说明书云弟描写云的想像作文申请信箱怎么样申请一个免费的信箱移动通信培训移动通讯有那些考证啊?? 有悬赏的哦!!!跨境电商开发跨境电商需要准备哪些东西
深圳网站空间 n点虚拟主机管理系统 服务器配置技术网 西安电信测速 t牌 cloudstack 国外空间服务商 evssl证书 华为云主机 长沙服务器 ca4249 hostloc 国外视频网站有哪些 上海电信测速 阿里云邮箱登陆地址 xshell5注册码 镇江高防服务器 建站技术 alexa搜 so域名 更多