Java中可重入锁synchronized,ReentrantLock简介

可重入锁

即可以加锁多次,解锁也可以多次,且加锁解锁次数相抵消才行.
synchronized和ReentrantLock都是可重入锁

代码案例演示

public class ReentrantLockDemo2 {
     
    private static ReentrantLock lock = new ReentrantLock();

    public static void main(String[] args) {
     
        new Thread(()->{
     
            getUser();
        },"t1").start();

        new Thread(()->{
     
            getUser();
        },"t2").start();
    }

    public  static void getUser(){
     
        lock.lock();
        System.out.println(Thread.currentThread().getName()+"入"+lock.getHoldCount()+"次");
        try {
     
            System.out.println(Thread.currentThread().getName()+"获取用户");
            getArticle();

        } finally {
     
            lock.unlock();
        }


    }

    public  static void getArticle(){
     
        lock.lock();
        System.out.println(Thread.currentThread().getName()+"入"+lock.getHoldCount()+"次");
        try {
     
            System.out.println(Thread.currentThread().getName()+"============获取文章");
        } finally {
     
            lock.unlock();
        }
    }

}

输出结果

Java中可重入锁synchronized,ReentrantLock简介_第1张图片

上述代码个人理解

加锁次数可以多次,但是解锁必须与之匹配
为什么可重入?我认为是t1线程获得第一把锁,也就是锁的标志位变为1,此时t1线程认为自己是安全的,因为没有其他线程可以和他抢第二把锁,因为想拿到第二把锁,必须拿到第一把锁
拿到第二把锁标志位变为2,执行完临界区代码后,第二把锁先解锁,此时标志位变1,然后解锁第一把锁,标志位变0.此时t2线程才可以执行

这是可重入锁的精髓

这段代码是可以执行的 ,通常作为面试点
实际多线程代码不这么写

lock.lock();
lock.lock();
lock.unlock();
lock.unlock();

你可能感兴趣的:(Java,多线程,JUC,多线程,java,并发编程,thread)