You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否必须在finally块中执行lock.unlock()?对JLS规范存疑

是否需要在finally块中执行lock.unlock()?

你完全误解了Java规范里的描述——规范里说的「自动解锁」是针对内置监视器锁(也就是synchronized关键字实现的锁),而你代码里用的是java.util.concurrent.locks.Lock接口的显式锁,这俩根本不是一回事。

给你掰扯清楚:

  • 要是用synchronized代码块或者方法,不管代码正常跑完还是抛出异常,JVM都会自动帮你释放锁,确实不用手动写解锁逻辑。
  • 但Lock是显式锁,完全靠开发者手动控制锁的获取和释放。你调用lock()拿到锁后,必须手动调用unlock()来释放,而且必须把unlock()放在finally块里。
    为啥要放finally?因为如果try块里的代码抛出异常,要是没在finally里解锁,这个锁就会一直被当前线程持有,其他线程永远拿不到锁,轻则线程阻塞,重则直接死锁。

你贴的那段代码写法是完全正确的,针对显式Lock,必须这么做才能保证锁一定会被释放。

内容的提问来源于stack exchange,提问作者Sergey Zolotarev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:22:01