Java多线程之可重入锁概念

Java多线程之可重入锁概念

一、什么是可重入锁

​ 在java中,可重入锁分为两种,即synchronized锁以及ReentrantLock及其实现。那么,什么是重入锁呢,其实重入锁就是一个线程能否获取一个已经由它自己持有的锁。如果可以,就是可重入锁,否则为不可重入锁。它的作用就是能够避免重复获取的时候出现死锁。

二、demo

1、synchronized

public class ReentrantSynchronizer {
    public synchronized void print() {
        System.out.println(Thread.currentThread().getName());
        printf();
    }

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

    public static void main(String[] args) {
        ReentrantSynchronizer reentrantSynchronizer = new ReentrantSynchronizer();
        for (;;){
            reentrantSynchronizer.print();
        }
    }
}

以上的demo就是测试synchronized的可重入性质,方法一中调用方法二,方法二又调用方法一,即结构类似于

synchronized(this){
  synchronized(this){
    
  }
}

结果:

main
main
main
main
main
main
...

证明synchronized是可重入锁


2、UnReentrantLock

​ 这里用一个demo来模拟不可重入锁的特性,事实上,在JUC中都是重入锁。

public class UnReentrantLock {
    private AtomicReference<Thread> owner = new AtomicReference<>();

    public void lock() {
        Thread current = Thread.currentThread();
        for (; ; ) {
            if (owner.compareAndSet(null, current)) {
                System.err.println("EXIT");
                return;
            }
        }
    }

    public void unlock() {
        Thread current = Thread.currentThread();
        owner.compareAndSet(current, null);
    }

    public static void main(String[] args) {
        UnReentrantLock unReentrantLock=new UnReentrantLock();
        unReentrantLock.lock();
        //unReentrantLock.unlock();
        //连续两次执行lock就会造成死锁
        unReentrantLock.lock();

    }
}	

​ 上面我们可以看到,不可重入锁如果同一线程连续调用两次,就会造成死锁。

3、ReentrantLock

​ 这是一个JUC的可重入锁,具体的demo 测试就交给你们去动手了,比较简单,连续两次lock看看就行。

三、总结

  • 可重入锁、不可重入锁,针对的对象是同一线程。
  • 对于可重入锁,获取了该锁的线程可以重复获取该锁,不会造成死锁。
  • 而不可重入锁,获取该锁的线程再获取该锁的时候,会等待对方释放,造成死锁。
发布了57 篇原创文章 · 获赞 32 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/rekingman/article/details/98848904