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次)。

 

 

总结:

必须配对上锁解锁过程,否则会引发各种错误。

 

posted on 2021-07-17 15:27  从精通到陌生  阅读(240)  评论(0编辑  收藏  举报