【线程基础】如何理解可重入锁?

可重入锁

广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁以后,在内层仍然能够使用,而且不发生死锁(前提得是同一个对象或者class),这样的锁就叫作可重入锁。ReentrantLock和synchronized都是可重入锁,下面是一个用synchronized实现的例子:bash

synchronized的可重入性

synchronized是JVM内置锁。ui

可重入性的实现方式是,synchronized会为每个锁关联一个获取计数器和全部者线程,其余线程调用会阻塞;若是相同的线程再次调用这个锁,计数值递增;退出时,递减,当计数为0时,锁会被释放,spa

public class ReentrantTest implements Runnable {

    public synchronized void get() {
        System.out.println(Thread.currentThread().getName());
        set();
    }

    public synchronized void set() {
        System.out.println(Thread.currentThread().getName());
    }

    public void run() {
        get();
    }

    public static void main(String[] args) {
        ReentrantTest rt = new ReentrantTest();
        for(;;){
            new Thread(rt).start();
        }
    }
}
复制代码