响应中断的锁与定时锁的实现原理
来源:互联网 发布:在管委会上班好吗知乎 编辑:程序博客网 时间:2024/04/30 01:32
响应中断的锁
在JDK5之前使用Synchronized作为获取锁的关键字,但是在获取锁的过程中无法中断,及时调用Thread.interrupt也不会中断。
为了能够使线程快速的响应中断,可以使用lock.lockInterruptibly方法。
通过源码分析可中断的锁
ReentrantLock的lockInterruptibly的基本使用
public static void main(String[] args) throws InterruptedException { ReentrantLock lock = new ReentrantLock(true); Thread t1 = new Thread(new Runnable() { @Override public void run() { try { TimeUnit.SECONDS.sleep(1); System.out.println("我是终端锁,在等待被中断"); lock.lockInterruptibly();//此处如果是lock.lock(),及时线程2来中断也不会做任何响应. System.out.println("如果我出现,则代表,我不能相应终端"); } catch (InterruptedException e) { e.printStackTrace(); System.out.println("我被打断了"); } finally { lock.unlock(); } } }); t1.start(); Thread t2 = new Thread(new Runnable() { @Override public void run() { try { lock.lock(); System.out.println(new Date() + ":我要睡5秒"); TimeUnit.SECONDS.sleep(5); System.out.println("开始打断线程1"); t1.interrupt(); TimeUnit.SECONDS.sleep(3); System.out.println("已经打断了线程1"); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }); t2.start(); }
线程1使用lock.lockInterruptibly(),当该线程获取不到锁的时候,阻塞。
线程2先获得锁,此时去中断线程1,线程1相应中断抛出异常。
源码分析lockInterruptibly方法
lock()底层使用AQS的acquireQueued方法。
lock.lockInterruptibly() 底层使用AQS的doAcquireInterruptibly
方法。
acquireQueued和doAcquireInterruptibly的唯一不同是,当出现中断后,doAcquireInterruptibly会抛出异常:
if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt()) throw new InterruptedException();
到此为止我们总共介绍了AQS中的:
1. 排它锁
2. 共享锁
3. Condition
4. 可相应中断的锁
最后还有一个,5. 定时锁
tryLock(long timeout, TimeUnit unit)
在这里就不再介绍了,实际上就是AQS中doAcquireNanos的实现,相比lock,设置了一个锁的时长 LockSupport.parkNanos(this, nanosTimeout);
0 0
- 响应中断的锁与定时锁的实现原理
- 中断的响应过程
- arduino的定时中断
- 定时/计数器用于外部中断扩展的原理
- AbstractQueuedSynchronizer源码剖析(三)- 响应中断的独占锁
- AbstractQueuedSynchronizer源码剖析(五)- 响应中断的共享锁
- 硬中断 / 软中断的原理和实现
- ARM 中断程序的原理和实现
- linux软中断的实现原理
- linux软中断的实现原理
- ARM中断程序的原理和实现
- ARM中断程序的原理和实现
- ARM 中断程序的原理和实现
- linux软中断的实现原理
- 【中断异常】中断的响应和服务
- NVIC 的抢占中断和响应中断
- 51单片机以定时中断的方法实现DS18B20时序
- 51单片机的中断与定时计数器尝试
- 容量规划经验谈:
- 解决更新yum源的时候报错404的问题
- 更高的抽象,更高的格局:
- Unity3d之设计模式(四)外观模式
- 搞清楚局部和全部,搞清楚逻辑和物理,搞清楚这些对于理解一些组件的概念是非常有意义的:
- 响应中断的锁与定时锁的实现原理
- 使用adb从Android中pull文件到windows
- 如何快速认识一个组件:
- Git学习笔记
- 在技术选型前,如何调研组件,经验谈:
- 构造函数与类外定义
- 大数据相乘
- Ubuntu安装redis的两种方法
- RocketMQ中的message queue是个什么,该怎么理解?