1.如果只是当前线程自己使用递归锁,没有完全配对上锁解锁,可以正常运行,但如果还有别的线程则会引发问题,最好上锁和解锁配对使用。
下面例子演示 ,t1线程故意内层不释放锁,引起t2线程阻塞。代码如下:
public class SynclockDemo { public static void main(String[ ]args) { Lock lock = new ReentrantLock(); new Thread(() -> { try { lock.lock(); System.out.println(Thread.currentThread().getName() +" 外层"); try { lock.lock(); System.out.println(Thread.currentThread().getName() +" 内层"); } finally { //故意不释放锁观察t2线程是否正常运行,结果t2线程一直阻塞 // lock.unlock(); } } finally { lock.unlock(); } },"t1").start(); new Thread(() -> { lock.lock(); System.out.println(Thread.currentThread().getName() +"外层"); lock.unlock(); },"t2").start(); } }
结果: t2线程一直阻塞,原因t1线程未正常上锁解锁(上锁2次解锁1次)。
总结:
必须配对上锁解锁过程,否则会引发各种错误。