美文网首页
JUC之可重入锁

JUC之可重入锁

作者: 西界__ | 来源:发表于2020-12-30 16:08 被阅读0次

可重入锁

可重入锁又叫递归锁,指的是同一线程外层函数获得锁之后,内存递归函数仍然能获取该锁的代码,同一个线程在外层获取锁的时候,进入内层方法会自动获取锁。也就是说,线程可以进入任何一个它已经拥有的锁所同步者的代码块。

ReentrantLock/synchronized就是一个典型的可重入锁

代码验证

synchronized

public class ReenterLockDemo {

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

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

class Phone {
    public synchronized void sendSMS(){
        System.out.println(Thread.currentThread().getName()+"\t invoked sendSMS()");
        sendEmail();
    }

    public synchronized void sendEmail(){
        System.out.println(Thread.currentThread().getName()+"\t invoked sendEmail()");
    }
}

当t1线程执行sendSMS()方法后,该方法中调用来同步方法sendEmail()。线程t1拿到外层函数sendSMS的锁后,能继续执行内层函数sendEmail。这就是可重入锁。

ReentrantLock

public class ReenterLockDemo {
    public static void main(String[] args) {
        Phone phone = new Phone();
        new Thread(() -> {
            phone.sendSMS();
        }, "t1").start();

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

class Phone {
    Lock lock = new ReentrantLock();

    public void sendSMS() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "\t invoked sendSMS()");
            sendEmail();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void sendEmail() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "\t invoked sendEmail()");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}

<mark>ReentrantLock 和 synchronized 不一样,需要手动释放锁,所以使用 ReentrantLock的时候一定要手动释放锁,并且加锁次数和释放次数要一样。</mark>

sendEmail()方法中加锁了两次,而只解锁了一次。就会导致t1线程执行完sendEmail后死锁,t2线程只能不停等待t1结束!

相关文章

  • JUC之可重入锁

    可重入锁 可重入锁又叫递归锁,指的是同一线程外层函数获得锁之后,内存递归函数仍然能获取该锁的代码,同一个线程在外层...

  • 12给女朋友讲讲并发编程-ReentrantLock

    一、简介 ReentrantLock为可重入锁,整体功能比synchronized更为强大,属于JUC包下的.与s...

  • 并发—ReentrantLock源码分析

    ReentrantLock ReentrantLock,是JUC提供的重入锁,底层依赖AQS(AbstractQu...

  • JUC之ReentrantLock源码阅读

    ReentrantLock是juc包里的一种重要的锁。可重入锁,顾名思义,就是一个线程可以重复进入该锁所保护的临界...

  • JUC原理之ReentrantLock

    概念 ReentrantLock是Java JUC包中最为重要的一员。中文翻译为可重入锁,意思是允许一个已经获得锁...

  • ReentrantLock 源码分析

    锁的基本概念 可重入锁 Reentrant 就是可重入的意思,如果锁具备可重入性,则称作为可重入锁。像synchr...

  • JUC锁框架_ ReentrantLock原理分析

    上一章详细介绍了AQS的源码,这一章我们来分析JUC框架中最常用的锁ReentrantLock(可重入独占锁,也叫...

  • 探索 JUC 之美---可重入读写锁 ReentrantRead

    读写锁维护了一对相关的锁,一个用于只读操作,一个用于写入操作。只要没有writer,读锁可以由多个reader线程...

  • java可重入锁

    可重入概念: java的可重入锁: 可重入锁的一种实现方式: 可重入锁的两种使用例子: 例子1: 例子2: 例子1...

  • Java 可重入锁 公平锁 读写锁

    1.可重入锁 如果锁具备可重入性,则称作为可重入锁。 像synchronized和ReentrantLock都是可...

网友评论

      本文标题:JUC之可重入锁

      本文链接:https://www.haomeiwen.com/subject/hgddnktx.html