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相关推荐

  1. java 显式锁_Java 实现一个自己的显式锁Lock(有超时功能)

    Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...

  2. java Lock 源码分析

    java 中的lock 先关的类路径: Lock 是个接口,源码: // // Source code recreated from a .class file by IntelliJ IDEA // ...

  3. java 显示锁_Java 实现一个自己的显式锁Lock(有超时功能)

    Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...

  4. java 并发编程学习之二 ---- lock

    在Java中有两种方法实现锁机制,一种是在前一篇博客中([java7并发编程实战]-–线程同步机制:synchronized)介绍的synchronized,而另一种是比synchronized更加强 ...

  5. java中boolean开关_在Java中,BooleanLock是Lock的一个Boolean实现

    BooleanLock是Lock的一个Boolean实现,通过控制一个Boolean变量的开关来决定是否允许当前的线程获取该锁,首先定义三个非常重要的成员变量,如下所示: package com.wa ...

  6. Java中的Lock详解

    一.简介 java.util.concurrent.locks.Lock 是一个类似于synchronized 块的线程同步机制.但是 Lock比 synchronized 块更加灵活.Lock是个接 ...

  7. klock 分布式锁重大更新

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   klock简介 基于redis的分布式锁spring-boot starter组件,使得项目拥有分布式锁能力变得异常简单,支持spring ...

  8. java dump分析工具_java性能分析与常用工具

    本次源码已放在Github:https://github.com/nateshao/jvm-tuning 个人博客 https://nateshao.gitee.io http://www.nates ...

  9. Java多线程编程模式实战指南(三):Two-phase Termination模式--转载

    本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-t ...

最新文章

  1. 正则表达式基础(一)
  2. Apache Thrift - 可伸缩的跨语言服务开发框架 ---转载
  3. 09-一对多关系建表
  4. 基因行业容器存储解决方案
  5. 基于多源文档片段的神经网络排序模型(Neural Ranking Models with Multiple Document Fields)
  6. 跟我一起学docker(17)--多节点mesos集群
  7. BOM组件物料重复检查
  8. spark源码阅读之network(2)
  9. linux性能监测工具
  10. 帕斯卡计算机的控制原理,液体静力学基本方程式和帕斯卡原理
  11. 车主之家-汽车销量与汽车配置-python爬虫实现
  12. 计算签到记录的次数统计
  13. ibm cloud怎么使用_使用IBM Cloud中的业务规则服务构建酒店预订应用程序
  14. 牛客上C++的面试题和答案
  15. MySQL里SQL基本语句的使用
  16. 计算机b级机房建设标准,A类机房建设标准和B类机房建设标准【全国施工】
  17. 罗技k380连接双系统(win10和ubuntu18)
  18. socket协议基础知识
  19. po是什么意思java_在Java中VO , PO , BO , QO, DAO ,POJO是什么意思
  20. bartender 不打印文本内容的解决方法

热门文章

  1. uniapp 界面拖动,去掉半圆形阴影
  2. ubuntu 下 Could not get lock /var/lib/dpkg/lock解决方案
  3. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...
  4. 20165204 第十周课下作业补做
  5. 计算机系统—CPU结构和内部工作
  6. 实践--课程表(仿超级课程表展示课表)
  7. 在windows下如何快速搭建web.py开发框架
  8. 最新OPhone 开发官网
  9. Google浏览器(您的连接不是私密连接)解决方案
  10. # vmware异常关机后,虚拟系统无法启动的解决办法