首页

文章

什么是可中断锁?有什么用?怎么实现?

发布网友 发布时间:2024-10-24 17:55

我来回答

1个回答

热心网友 时间:2024-10-29 17:14

在Java中有两种锁,一种是内置锁synchronized,一种是显示锁Lock,其中Lock锁是可中断锁,而synchronized则为不可中断锁。

所谓的中断锁指的是锁在执行时可被中断,也就是在执行时可以接收interrupt的通知,从而中断锁执行。

PS:默认情况下Lock也是不可中断锁,但是可以通过特殊的“手段”,可以让其变为可中断锁,接下来我们一起来看。

为什么需要可中断锁?

不可中断锁的问题是,当出现“异常”时,只能一直阻塞等待,别无其他办法,比如下面这个程序。下面的这个程序中有两个线程,其中线程1先获取到锁资源执行相应代码,而线程2在0.5s之后开始尝试获取锁资源,但线程1执行时忘记释放锁了,这就造成线程2一直阻塞等待的情况,实现代码如下:

importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassInterruptiblyExample{publicstaticvoidmain(String[]args){Locklock=newReentrantLock();//创建线程1Threadt1=newThread(newRunnable(){@Overridepublicvoidrun(){lock.lock();System.out.println("线程1:获取到锁.");//线程1未释放锁}});t1.start();//创建线程2Threadt2=newThread(newRunnable(){@Overridepublicvoidrun(){//先休眠0.5s,让线程1先执行try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}//获取锁System.out.println("线程2:等待获取锁.");lock.lock();try{System.out.println("线程2:获取锁成功.");}finally{lock.unlock();}}});t2.start();}}

以上代码执行的结果如下:

从上述结果可以看出,此时线程2在等待获取锁的操作,然而经历了N久之后...

再次查看结果,依然是熟悉的画面:

线程2还在阻塞等待获取线程1释放锁资源,此时的线程2除了等之外,并无其他方法。

并且,但我们熟练的拿出了JConsole,试图得到一个死锁的具体信息时,却得到了这样的结果:

并没有检测到任何死锁信息,从上图我们可以看出,当只有一个锁资源的时候,系统并不会把这种情况判定为死锁,当然也没有阻塞等待的具体信息喽,此时只剩下线程2孤单地等待着它的“锁儿”。

使用中断锁

然而,中断锁的出现,就可以打破这一僵局,它可以在等待一定时间之后,主动的中断线程2,以解决线程阻塞等待的问题。

中断锁的核心实现代码是lock.lockInterruptibly()方法,它和lock.lock()方法作用类似,只不过使用lockInterruptibly方法可以优先接收中断的请求,中断锁的具体实现如下:

importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassInterruptiblyExample{publicstaticvoidmain(String[]args)throwsInterruptedException{Locklock=newReentrantLock();//创建线程1Threadt1=newThread(newRunnable(){@Overridepublicvoidrun(){try{//加锁操作lock.lock();System.out.println("线程1:获取到锁.");}catch(InterruptedExceptione){e.printStackTrace();}//线程1未释放锁}});t1.start();//创建线程2Threadt2=newThread(newRunnable(){@Overridepublicvoidrun(){//先休眠0.5s,让线程1先执行try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}//获取锁try{System.out.println("线程2:尝试获取锁.");lock.lockInterruptibly();//可中断锁System.out.println("线程2:获取锁成功.");}catch(InterruptedExceptione){System.out.println("线程2:执行已被中断.");}}});t2.start();//等待2s后,终止线程2Thread.sleep(2000);if(t2.isAlive()){//线程2还在执行System.out.println("执行线程的中断.");t2.interrupt();}else{System.out.println("线程2:执行完成.");}}}

以上代码执行结果如下:

从上述结果可以看出,当我们使用了lockInterruptibly方法就可以在一段时间之后,判断它是否还在阻塞等待,如果结果为真,就可以直接将他中断,如上图效果所示。

但当我们尝试将lockInterruptibly方法换成lock方法之后(其他代码都不变),执行的结果就完全不一样了,实现代码如下:

importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassInterruptiblyExample{publicstaticvoidmain(String[]args)throwsInterruptedException{Locklock=newReentrantLock();//创建线程1Threadt1=newThread(newRunnable(){@Overridepublicvoidrun(){try{//加锁操作lock.lockInterruptibly();System.out.println("线程1:获取到锁.");}catch(InterruptedExceptione){e.printStackTrace();}//线程1未释放锁}});t1.start();//创建线程2Threadt2=newThread(newRunnable(){@Overridepublicvoidrun(){//先休眠0.5s,让线程1先执行try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}//获取锁try{System.out.println("线程2:尝试获取锁.");lock.lock();System.out.println("线程2:获取锁成功.");}catch(Exceptione){System.out.println("线程2:执行已被中断.");}}});t2.start();//等待2s后,终止线程2Thread.sleep(2000);if(t2.isAlive()){//线程2还在执行System.out.println("执行线程的中断.");t2.interrupt();}else{System.out.println("线程2:执行完成.");}}}

以上程序执行结果如下:

从上图可以看出,当使用lock方法时,即使调用了interrupt方法依然不能将线程2进行中断。

总结

本文介绍了中断锁的实现,通过显示锁Lock的lockInterruptibly方法来完成,它和lock方法作用类似,但lockInterruptibly可以优先接收到中断的通知,而lock方法只能“死等”锁资源的释放,同时这两个方法的区别也是常见的面试题,希望本文对你有用。

关注公号「Java中文社群」查看更多有意思、涨知识的Java并发文章。

视频相册制作软件如何做视频相册? 用word2007自动生成目录后,目录上始终有个“ 更新目录”的框,怎么去... Word2007目录怎么删除正文 手机不能横屏了是怎么回事? 庞贝柱的结构样貌是怎样的? 埃及庞贝柱景点描述 庞贝柱是怎样的历史? 埃及庞贝柱历史追溯 庞贝柱是个什么样的景点? 庞贝柱是为为了答谢谁而建的? 属蛇穿什么转运最旺运 属蛇什么颜色转运最旺 属蛇的人什么颜色转运最旺 英国查理一世时期君主专政的特征 增值税专用发票开错作废证明怎么写 女主为了救男主被拔掉指甲,被活埋,但男主却认错了人,这本小说叫... 什么地方能读到法拉奇的小说男子汉 高级职称有什么待遇 职称高级相当于什么? HUAWEI 华为 AM185 入耳式有线降噪耳机-适用对象 华为FreeBuds Pro有线充版-入耳式真无线动圈主动降噪蓝牙耳机(陶瓷白... HUAWEI 华为 FreeLace Pro 入耳式颈挂式动圈主动降噪蓝牙耳机 曜石黑... HUAWEI 华为 FreeBuds Pro 入耳式真无线动圈主动降噪蓝牙耳机 墨韵白推... 华为Freebuds 3 无线充版半入耳式真无线蓝牙耳机(碳晶黑)-详细介绍... HUAWEI 华为 FreeBuds 悦享版 入耳式无线蓝牙耳机-详细介绍 如何评价华为新旗舰tws耳机freebudspro? HUAWEI 华为 FreeBuds Pro 无线蓝牙耳机推荐 字符串"\\\"ABC\"\\"所占内存字节的长度 怎样挑选千元内的羊绒大衣? 现在思科的CCNA,CCNE,CCIP的考证费分别是多少啊,通过率怎样 长春小飞没有车没有房 碳钢的多久生锈 碳钢多久会生锈 碳钢多长时间会开始生锈 碳钢和铝哪个容易生锈 梦见天宫图是什么意思 光遇2023好友树解锁图鉴 光遇二级节点多少个 ...火柴小女孩》《词语手册》里有很多词语的意思的,求告知 暖融融解释 领淘通淘客助手这个软件怎么样? 淘宝客必备的九大工具有哪些? 电脑里硬盘如何共享怎么实现多台电脑共用一块硬盘 两台电脑一个硬盘两台电脑是否可以同时用一个硬盘 共享电脑硬盘怎样设置局域网电脑硬盘共享 现在下载歌曲好还是不下好 故障码P033D的含义解析 切菜机多功能型切菜机 scanbox三维扫描仪 苹果13没有删除的备忘录怎么恢复? iphone备忘录永久删除怎么恢复?iphone备忘录恢复最近删除文件方法介绍... affalterbach车标 IP地址被163聊天室封了怎么办 ...车车身前面没有梅赛德斯的一个圆圆的标志,有些有呢?是不是AMG... 《少年的你》票房破13亿:直击人心的,或是看到了曾经的自己 synchronized锁定的到底是什么? 橡胶和pvc的区别大吗 进163聊天室一定要关联手机吗? ...合作的女主之后,会是爆款剧没错了!你怎么看? 百度提问里的手机绑定,换手机号时,如何修改? 空调外面为什么有水 武则天为什么不传位给女儿,而传给儿子? 最原始的生物如何形成的? 无锡方盛换热器制造有限公司换热器研发分公司怎么样? 无锡方盛换热器股份有限公司怎么样 在十万人口的县城开一家健身馆要多少钱房子是200平的 怎么样电池耐用 微创切除子宫术后注意事项 手机如何延长续航时间? 一家宠物店大概需要多少投资 动画一骑当千 于吉和孙策打是哪一集 声带息肉手术后四个小时了可以侧躺吗 怎么跟家人道歉,才能修复我和家人的关系? oppok9屏幕上显示hd 用什么方式跟家人道歉 “跟家人吵架后该如何道歉”引发思考,你和家人有矛盾都是如何解决的... 正源学校基础设施 ...家人知道后现在不相信我了,我该咋办?指望一下 百度提问里的手机绑定,换手机号时,如何修改? 广发证券佣金是什么 win7访问共享文件夹出现登录失败,怎么办? 广发证券编号是什么 广发证券专属流量是什么意思 橡胶和pvc的区别大吗 用过都说好的国产思维导图软件,到底强在哪里? 谈一谈我写作生涯的画图技巧 进163聊天室一定要关联手机吗? ___克硝酸铵所含氮元素的质量和120克尿素中所含氮元素的质量相等要求... 十二克尿素中含碳元素质量与多少克硝酸铵中碳元素质量相等? 怎么跟家人道歉,才能修复我和家人的关系? IP地址被163聊天室封了怎么办
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com