是否必须在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
相关产品推荐
相关产品推荐

