ReentrantReadWriteLock tokenLock = new ReentrantReadWriteLock();
tokenLock.readLock().lock();
try {
String tokenId = null;
if (StringUtils.isEmpty(tokenId)) {
// 上写锁之前需先释放读锁
tokenLock.readLock().unlock();
tokenLock.writeLock().lock();
try {
// 再次获取 token,此时可能存在其他线程已经更新了这个值
tokenId = null;
if (StringUtils.isEmpty(tokenId)) {
int i = 1 / 0;
System.out.println(i);
}
// ①在释放写锁之前通过获取读锁来降级
tokenLock.readLock().lock();
} finally {
// ②在释放写锁之前通过获取读锁来降级
//tokenLock.readLock().lock();
// 释放写锁,但是读锁还是在挂起的
tokenLock.writeLock().unlock();
}
}
System.out.println(tokenId);
} finally {
tokenLock.readLock().unlock();
}
当①开放时,报错信息为:
Exception in thread "main" java.lang.IllegalMonitorStateException: attempt to unlock read lock, not locked by current thread
当②开放时,报错信息为:
Exception in thread "main" java.lang.ArithmeticException: / by zero
测试环境①突然报了个unlock 找不到锁,根本定位不到问题所在
改为②写法,报错位置定位准确
因为在1的位置,try里面报错了,报错后后续代码都不执行了,所以你的lock根本没有执行
而lock没执行,后续直接执行了unlock,能不报错吗