3.锁不能被释放多次
lock 操作的次数和 unlock 操作的次数必须一一对应,且不能出现一个锁被释放多次的情况,因为这样就会导致程序报错。
反例
一次 lock 对应了两次 unlock 操作,导致程序报错并终止执行,示例代码如下:
import java.util.concurrent.locks.ReentrantLock; publicclass LockExample { // 创建锁对象 privatestaticfinal ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { // 加锁操作 lock.lock(); // 第一次释放锁 try { System.out.println("执行业务 1~"); // 业务代码 1...... } finally { // 释放锁 lock.unlock(); System.out.println("锁释锁"); } // 第二次释放锁 try { System.out.println("执行业务 2~"); // 业务代码 2...... } finally { // 释放锁 lock.unlock(); System.out.println("锁释锁"); } // 最后的打印操作 System.out.println("程序执行完成."); } }
以上程序的执行结果如下:
从上述结果可以看出,执行第 2 个 unlock 时,程序报错并终止执行了,导致异常之后的代码都未正常执行。