ReentrantLock的lock()和lockInterruptibly()方法的区别
发布日期:2021-06-29 03:44:51
浏览次数:2
分类:技术文章
本文共 3306 字,大约阅读时间需要 11 分钟。
1,ReentrantLock的lock()不会再获锁过程中去响应中断标志。而是再获取锁之后才响应中断。
2,ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获取锁,而会抛出一个InterruptedException。
代码示例:
1.使用lockInterruptibly()的情况:
public class ReentrantLockInterruptibly { private Lock lock = new ReentrantLock(); public void doBussiness() { String name = Thread.currentThread().getName(); try { System.out.println(name + " 开始获取锁"); lock.lockInterruptibly(); System.out.println(name + " 得到锁"); System.out.println(name + " 开工干活"); for (int i=0; i<5; i++) { Thread.sleep(1000); System.out.println(name + " : " + i); } } catch (InterruptedException e) { System.out.println(name + " 被中断"); System.out.println(name + " 做些别的事情"); } finally { try { lock.unlock(); System.out.println(name + " 释放锁"); } catch (Exception e) { System.out.println(name + " : 没有得到锁的线程运行结束"); } } } public static void main(String[] args) throws InterruptedException { ReentrantLockInterruptibly lockTest = new ReentrantLockInterruptibly(); Thread t0 = new Thread(lockTest::doBussiness); Thread t1 = new Thread(lockTest::doBussiness); // 启动线程t1 t0.start(); Thread.sleep(10); // 启动线程t2 t1.start(); t1.interrupt(); }}
返回结果:
Thread-0 开始获取锁Thread-0 得到锁Thread-0 开工干活Thread-1 开始获取锁Thread-1 被中断Thread-1 做些别的事情Thread-1 : 没有得到锁的线程运行结束Thread-0 : 0Thread-0 : 1Thread-0 : 2Thread-0 : 3Thread-0 : 4Thread-0 释放锁
即当thread-0持有了锁在进行任务执行的过程中,主线程使用t1.interrupt();中断了t1线程,使用lock.lockInterruptibly();会立马抛出一个InterruptedException 并进行之后的操作
2.使用lock.lock()情况
public class ReentrantLockInterruptibly { private Lock lock = new ReentrantLock(); public void doBussiness() { String name = Thread.currentThread().getName(); try { System.out.println(name + " 开始获取锁"); lock.lock(); System.out.println(name + " 得到锁"); System.out.println(name + " 开工干活"); for (int i=0; i<5; i++) { Thread.sleep(1000); System.out.println(name + " : " + i); } } catch (InterruptedException e) { System.out.println(name + " 被中断"); System.out.println(name + " 做些别的事情"); } finally { try { lock.unlock(); System.out.println(name + " 释放锁"); } catch (Exception e) { System.out.println(name + " : 没有得到锁的线程运行结束"); } } } public static void main(String[] args) throws InterruptedException { ReentrantLockInterruptibly lockTest = new ReentrantLockInterruptibly(); Thread t0 = new Thread(lockTest::doBussiness); Thread t1 = new Thread(lockTest::doBussiness); // 启动线程t1 t0.start(); Thread.sleep(10); // 启动线程t2 t1.start(); t1.interrupt(); }}
返回结果:
Thread-0 开始获取锁Thread-0 得到锁Thread-0 开工干活Thread-1 开始获取锁Thread-0 : 0Thread-0 : 1Thread-0 : 2Thread-0 : 3Thread-0 : 4Thread-0 释放锁Thread-1 得到锁Thread-1 开工干活Thread-1 被中断Thread-1 做些别的事情
即:在t0线程持有锁并任务执行的过程中,主线程中断了t1线程,但是我们发现,此时t1线程不会立即响应中断标志,而是在t0释放锁之后,去拿到锁了之后,才去响应这个中断标志。
转载地址:https://blog.csdn.net/zcswl7961/article/details/113582631 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月28日 14时21分34秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
像数据科学家一样思考:12步指南(下)
2019-04-29
2.Makefile文件中包含哪些规则?
2019-04-29
阿里云ECS服务器的搭建
2019-04-29
简历上的项目经历怎么写 ?这 3 条原则不可忽视 ! ...
2019-04-29
线下活动预告:Elasticsearch 成都 Meetup(3.10)
2019-04-29
Linux基础命令---显示用户名logname
2019-04-29
SAP CRM系统订单模型的设计与实现
2019-04-29
在编写python代码时,小白最容易犯的十几个错误 ! ...
2019-04-29
为什么存储器会成为阻碍AI发展的难题?
2019-04-29
好程序员分享居中一个float元素
2019-04-29
[雪峰磁针石博客]pyspark工具机器学习(自然语言处理和推荐系统)1数据演进 ...
2019-04-29
xttdriver.pl
2019-04-29
Pyhanlp自然语言处理中的新词识别
2019-04-29
第二十一章:变换(六)
2019-04-29
[New Feature]OSS支持设置Bucket 服务端默认加密方式
2019-04-29
如何使用python分析CPU使用情况? 大概是这样吧
2019-04-29
你如何制定一份可实施的2019年大数据学习计划? ...
2019-04-29