下面代码是上个星期阿里社区推送的一道技术题中的代码。借助这个代码,检验一下自己。
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