使用Lock,需要注意的事项?阿里代码

下面代码是上个星期阿里社区推送的一道技术题中的代码。借助这个代码,检验一下自己。

3秒钟,看出什么问题了吗?

private final static Lock lock = new ReentrantLock();
public static void main(String[] args) {
    try {
        lock.tryLock();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}

看出问题了吗?

看出来了。给你点赞!!!!

没有看出来:“革命尚未成功,同志仍须努力”啊。其实写者当时也只看出了一个问题。呜呜呜。下面是参考阿里给出的解释,简单总结的三点,避免踩坑。

问题一:

获取锁的方法需要放在try代码块之外,并且尽量保证获取锁的方法和try代码块之间不能存在任何可能抛出异常的代码。获取锁的方法放在try代码块中,如果由于try中额外的代码抛出了异常,这时,如果还没有获取到锁,下面finally中的代码就会报错。相同的道理,获取锁的方法和try代码块之间的代码抛出异常,try就没有办法捕捉到异常,也就没有办法释放锁,会导致其它的线程无法成功获取锁。

问题二:

使用尝试机制获取锁时,在进入业务代码块之前,必须先判断当前线程是否持有锁。

问题三:

在释放锁的时lock.unlock(),需要判断当前线程是否持有锁,如果当前线程不持有锁,调用会抛出 java.lang.IllegalMonitorStateException 异常。

 

参考文章:https://mp.weixin.qq.com/s/Dl72umQuPIcNz_nsbE7j5w

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值