• 多线程递归锁 引发的问题


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

    总结:

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

  • 相关阅读:
    io学习三
    io学习二
    io学习一
    多线程学习(十五)
    spring源码阅读(四)
    多线程学习(十四)
    多线程学习(十三)
    设计模式(一)
    spring源码阅读(三)
    spring源码阅读(二)
  • 原文地址:https://www.cnblogs.com/liuyi13535496566/p/15023556.html
Copyright © 2020-2023  润新知