知识卡片
显式锁需模板
内容
显式锁(Lock 接口)把加锁解锁从 synchronized 的内置特性变成显式调用,换来可中断获取、非阻塞获取、限时抢锁等能力,但也把释放锁的风险交给了开发者。可靠写法是 lock() 放在 try 外,成功后进入 try/finally,在 finally 中 unlock()——若把 lock() 放进 try 块,抢锁失败时 unlock() 会因未持锁而抛异常。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第5章《JUC显式锁的原理与实战》5.1.1节《显式锁Lock接口》、5.1.3节《使用显式锁的模板代码》(源文件:_epub-src/OEBPS/Text/chapter155.xhtml、chapter157.xhtml)
- 结论依据:原文列出显式锁相对内置锁的三点优势(可中断获取、可非阻塞获取、可限时抢锁),并给出标准模板代码,明确指出“抢占锁操作lock.lock()必须在try语句块之外”“在抢占锁操作lock.lock()和try语句之间不要插入任何代码”,还举出把lock()放入try块导致unlock()抛异常的错误示例,因此推出本卡结论。
- 原始内容:释放锁操作lock.unlock()必须在try-catch结构的finally块中执行,否则,如果临界区代码抛出异常,锁就有可能永远得不到释放……抢占锁操作lock.lock()必须在try语句块之外……如果抢锁操作没有成功,也就是当前线程没有获取到锁,在finally语句块调用unlock()方法时就会抛出异常。