博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lock 与 InterruptedException
阅读量:6304 次
发布时间:2019-06-22

本文共 1501 字,大约阅读时间需要 5 分钟。

hot3.png

检测中断状态的方法一般是: 循环检测(猜测native方法wait、unsafe的park等方法也是用循环检测); 

对于一个线程 t, 其他线程只能改变其中断状态,系统(线程调度器)检测其中断状态,若被中断则将其唤醒(在阻塞的IO中不唤醒),然后由t检测自己的中断标志并抛出中断异常;

如果t不检查或检查中断而决定不抛出异常,也就是不搭理其他线程的信号,那么t就会像被正常唤醒一样,不过这会破坏系统的锁机制(同步与互斥),所以线程模型都是有系统和框架实现好的,规定其醒来后首先检测中断标志,若是因为被中断而唤醒,则释放资源(比如已经获得的锁,依框架机制而定)并抛出中断异常。

// ReentrantLock.java abstract static class Sync extends AbstractQueuedSynchronizer{     ... } static final class NonfairSync extends Sync {     ... } static final class FairSync extends Sync {      ... }           public void lockInterruptibly() throws InterruptedException {        sync.acquireInterruptibly(1);   }        public boolean tryLock(long timeout, TimeUnit unit)            throws InterruptedException {        return sync.tryAcquireNanos(1, unit.toNanos(timeout));    }

检测中断状态的方法一般是: 循环检测(猜测native方法wait、unsafe的park等方法也是用循环检测)

AbstractQueuedSynchronizer.java:

public final void acquireInterruptibly(int arg)            throws InterruptedException {        if (Thread.interrupted())            throw new InterruptedException();        if (!tryAcquire(arg))            doAcquireInterruptibly(arg);    }

AbstractQueuedSynchronizer.java:

170209_HV7g_255456.png

170209_PS3h_255456.png

170334_YBRu_255456.png

170528_AM5b_255456.png

private final boolean parkAndCheckInterrupt() {        LockSupport.park(this);        return Thread.interrupted();    }

LockSupport的park 可能使当前线程(称其为T)阻塞。当线程T阻塞时,如果其interrupt被调用,则park方法返回,但是park并不抛出InterruptedException, 即不改变T的中断状态,所以需要重新检查T的状态,正如上面的parkAndCheckInterrupt方法所做的一样。注意Thread.interrupted() 方法会返回并清楚当前的中断状态。

171733_NmT2_255456.png

转载于:https://my.oschina.net/u/255456/blog/374531

你可能感兴趣的文章
java数据结构 - 数组使用的代码
查看>>
个人简历-项目经验
查看>>
swoole异步任务task处理慢请求简单实例
查看>>
DHCP
查看>>
oracle数据泵导入分区表统计信息报错(四)
查看>>
spring技术内幕读书笔记之IoC容器的学习
查看>>
细说多线程(五) —— CLR线程池的I/O线程
查看>>
JavaScript instanceof和typeof的区别
查看>>
Hadoop文件系统详解-----(一)
查看>>
《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(8)--- 主动器...
查看>>
状态码
查看>>
我的友情链接
查看>>
用sqlplus远程连接oracle命令
查看>>
多年一直想完善的自由行政审批流程组件【2002年PHP,2008年.NET,2010年完善数据设计、代码实现】...
查看>>
自动生成四则运算题目
查看>>
【翻译】使用新的Sencha Cmd 4命令app watch
查看>>
【前台】【单页跳转】整个项目实现单页面跳转,抛弃iframe
查看>>
因为你是前端程序员!
查看>>
数据库设计中的14个技巧
查看>>
Android学习系列(5)--App布局初探之简单模型
查看>>