Lock 与 InterruptedException
2019独角兽企业重金招聘Python工程师标准>>>
检测中断状态的方法一般是: 循环检测(猜测native方法wait、unsafe的park等方法也是用循环检测);
对于一个线程 t, 其他线程只能改变其中断状态,系统(线程调度器)检测其中断状态,若被中断则将其唤醒(在阻塞的IO中不唤醒),然后由t检测自己的中断标志并抛出中断异常;
如果t不检查或检查中断而决定不抛出异常,也就是不搭理其他线程的信号,那么t就会像被正常唤醒一样,不过这会破坏系统的锁机制(同步与互斥),所以线程模型都是有系统和框架实现好的,规定其醒来后首先检测中断标志,若是因为被中断而唤醒,则释放资源(比如已经获得的锁,依框架机制而定)并抛出中断异常。
// ReentrantLock.javaabstract 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:
private final boolean parkAndCheckInterrupt() {LockSupport.park(this);return Thread.interrupted();}
LockSupport的park 可能使当前线程(称其为T)阻塞。当线程T阻塞时,如果其interrupt被调用,则park方法返回,但是park并不抛出InterruptedException, 即不改变T的中断状态,所以需要重新检查T的状态,正如上面的parkAndCheckInterrupt方法所做的一样。注意Thread.interrupted() 方法会返回并清楚当前的中断状态。
转载于:https://my.oschina.net/u/255456/blog/374531
Lock 与 InterruptedException相关推荐
- java 显式锁_Java 实现一个自己的显式锁Lock(有超时功能)
Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...
- java Lock 源码分析
java 中的lock 先关的类路径: Lock 是个接口,源码: // // Source code recreated from a .class file by IntelliJ IDEA // ...
- java 显示锁_Java 实现一个自己的显式锁Lock(有超时功能)
Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...
- java 并发编程学习之二 ---- lock
在Java中有两种方法实现锁机制,一种是在前一篇博客中([java7并发编程实战]-–线程同步机制:synchronized)介绍的synchronized,而另一种是比synchronized更加强 ...
- java中boolean开关_在Java中,BooleanLock是Lock的一个Boolean实现
BooleanLock是Lock的一个Boolean实现,通过控制一个Boolean变量的开关来决定是否允许当前的线程获取该锁,首先定义三个非常重要的成员变量,如下所示: package com.wa ...
- Java中的Lock详解
一.简介 java.util.concurrent.locks.Lock 是一个类似于synchronized 块的线程同步机制.但是 Lock比 synchronized 块更加灵活.Lock是个接 ...
- klock 分布式锁重大更新
开发四年只会写业务代码,分布式高并发都不会还做程序员? klock简介 基于redis的分布式锁spring-boot starter组件,使得项目拥有分布式锁能力变得异常简单,支持spring ...
- java dump分析工具_java性能分析与常用工具
本次源码已放在Github:https://github.com/nateshao/jvm-tuning 个人博客 https://nateshao.gitee.io http://www.nates ...
- Java多线程编程模式实战指南(三):Two-phase Termination模式--转载
本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-t ...
最新文章
- 正则表达式基础(一)
- Apache Thrift - 可伸缩的跨语言服务开发框架 ---转载
- 09-一对多关系建表
- 基因行业容器存储解决方案
- 基于多源文档片段的神经网络排序模型(Neural Ranking Models with Multiple Document Fields)
- 跟我一起学docker(17)--多节点mesos集群
- BOM组件物料重复检查
- spark源码阅读之network(2)
- linux性能监测工具
- 帕斯卡计算机的控制原理,液体静力学基本方程式和帕斯卡原理
- 车主之家-汽车销量与汽车配置-python爬虫实现
- 计算签到记录的次数统计
- ibm cloud怎么使用_使用IBM Cloud中的业务规则服务构建酒店预订应用程序
- 牛客上C++的面试题和答案
- MySQL里SQL基本语句的使用
- 计算机b级机房建设标准,A类机房建设标准和B类机房建设标准【全国施工】
- 罗技k380连接双系统(win10和ubuntu18)
- socket协议基础知识
- po是什么意思java_在Java中VO , PO , BO , QO, DAO ,POJO是什么意思
- bartender 不打印文本内容的解决方法
热门文章
- uniapp 界面拖动,去掉半圆形阴影
- ubuntu 下 Could not get lock /var/lib/dpkg/lock解决方案
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...
- 20165204 第十周课下作业补做
- 计算机系统—CPU结构和内部工作
- 实践--课程表(仿超级课程表展示课表)
- 在windows下如何快速搭建web.py开发框架
- 最新OPhone 开发官网
- Google浏览器(您的连接不是私密连接)解决方案
- # vmware异常关机后,虚拟系统无法启动的解决办法