知识卡片

可中断抢锁用于可取消等待

普通读书笔记卡 · 1522.a

内容

[[显式锁需模板]] 的 lock() 是不可中断的阻塞抢占,即使被 interrupt() 也只会继续等待。lockInterruptibly()(及带超时的 tryLock)会响应 [[中断只是设置一个标志]] 描述的中断信号:线程被中断后立刻终止抢占并抛异常。这在有取消协议或死锁监测场景中很有价值,可主动中断卡住的抢锁线程;简单临界区用普通 lock() 即可。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第5章《JUC显式锁的原理与实战》5.4.1节《锁的可中断抢占》(源文件:_epub-src/OEBPS/Text/chapter172.xhtml) - 结论依据:原文说明“可中断抢占锁抢占过程中会处理Thread.interrupt()中断信号,如果线程被中断,就会终止抢占并抛出InterruptedException异常”,并用两线程抢锁、主线程中断两者的演示代码证明:正在抢锁但未抢到的线程收到中断后立即“抢占被中断,抢锁失败”而不再等待,因此推出本卡结论。 - 原始内容:lockInterruptibly() 可中断抢占锁抢占过程中会处理Thread.interrupt()中断信号,如果线程被中断,就会终止抢占并抛出InterruptedException异常……[thread-2]:抢占被中断,抢锁失败