首页 > 其他分享 >可重入锁

可重入锁

时间:2024-12-22 17:31:42浏览次数:4  
标签:重入 synchronized lock 线程 ReentrantLockDemo public

可重入锁又名递归锁

是指同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提:锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。

Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。

 

synchronized底层原理

每个锁对象拥有一个锁计数器和一个指向持有该锁的线程的指针

当执行monitorenter时,如果目标对象的计数器为零,那么说明它没有被其他线程所持有,Java虚拟机会将该锁对象的持有线程设置为当前线程,并且将其计数器加1。

在目标锁对象的计数器不为0的情况下,如果锁对象的持有线程是当前线程,那么Java虚拟机可以将其计数器加1,否则需要等待,直至持有线程释放该锁。

当执行monitorexit时,Java虚拟机则需将锁对象的计数器减1,计数器为零代表锁已被释放。

 

synchronized验证可重入锁

public class ReentrantLockDemo {
    public ReentrantLockDemo() {
    }

    public synchronized void f1() {
        System.out.println("f1");
        f2();
    }

    public synchronized void f2() {
        System.out.println("f2");
        f3();
    }

    public synchronized void f3() {
        System.out.println("f3");
    }

    public static void main(String[] args) {
        ReentrantLockDemo reentrantLockDemo = new ReentrantLockDemo();
        reentrantLockDemo.f1();
    }
}

ReentrantLock验证可重入锁

public class ReentrantLockDemo {
    Lock lock = new ReentrantLock();

    public void m() {
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("1");
                lock.lock();
                try {
                    System.out.println(2);
                } finally {
                    lock.unlock();
                }
            } finally {
                lock.unlock();
            }
        }).start();
    }

    public static void main(String[] args) {
        ReentrantLockDemo reentrantLockDemo = new ReentrantLockDemo();
        reentrantLockDemo.m();
    }
}

标签:重入,synchronized,lock,线程,ReentrantLockDemo,public
From: https://www.cnblogs.com/damour-damocles/p/18620095

相关文章

  • 不可重入锁与死锁
    不可重入锁确实可能导致死锁,特别是在同一线程尝试多次获取同一把锁时。如果锁是不可重入的,那么线程在第二次尝试获取锁时会永远阻塞,从而导致死锁。不可重入锁与死锁的关系不可重入锁不允许同一个线程多次获取同一把锁。在以下情况下,这种限制会导致死锁:递归调用时:如果一......
  • Redisson分布式锁如何实现可重入
    Redisson分布式锁如何实现可重入本篇将从源码的角度去讲解Redisson分布式锁如何实现可重入的我们都知道Redisson的分布式锁比起我们自己用Redis实现的分布式锁有许多优点:可重入可重试超时续约当我们使用Redisson去获取一个分布式锁的时候,大致的代码如下:@Autowiredp......
  • java中有非可重入锁吗?
    Java中没有直接提供非可重入锁的实现,但可以通过一些手段来模拟非可重入锁的行为。首先,需要明确可重入锁和非可重入锁的概念。可重入锁允许同一个线程在持有锁的情况下再次获取该锁,而不会发生死锁。这通常是通过维护一个锁持有者的计数器和线程ID来实现的,当同一个线程再次......
  • 一文通Java 锁:锁机制及锁常见问题的深入解析(Java 并发编程(偏向、轻/重量级、读写、可
    在并发编程中,锁机制是保障线程安全的核心工具。锁的类型、使用场景、以及锁引发的种种问题都是开发者在设计高并发系统时必须应对的挑战。本篇博客将围绕锁的类型、应用场景、以及常见的锁问题展开详细讨论,帮助大家深入理解Java锁机制的优缺点与其适用场景。文章目录......
  • 重入锁ReentrantLock详解
    目录ReentrantLock简介可重入性ReentrantLock的特性中断响应公平锁与非公平锁非阻塞获取锁Condition类与synchronized的比较总结参考ReentrantLock简介重入锁ReentrantLock是Java并发包中提供的一种可重入锁,它相较于Java的synchronized关键字具有更多的功能和更细......
  • ReentrantLock-可重入锁
    ReentrantLock是Java并发包java.util.concurrent.locks中的一个类,它实现了Lock接口,提供了一种与Synchronized方法和语句相同的基本行为和语义的互斥锁,但具有更多的扩展功能。主要特点可重入性与synchronized关键字一样,ReentrantLock允许同一个线程多次获得锁,而不会发生死锁......
  • kimi:利用随机值验证标准库容器的读可重入性
    #include<iostream>#include<unordered_set>#include<thread>#include<mutex>#include<vector>#include<random>std::unordered_set<int>sharedSet;std::mutexsetMutex;voidinsertRandomNumbers(intcount){......
  • 【漏洞分析】Penpie 攻击事件:重入攻击构造奖励金额
    背景信息2024年9月3日,Penpie合约遭受重入攻击,攻击者在重入阶段向合约添加流动性来冒充奖励金额,从而获取合约内原有的奖励代币。资产损失高达2734万美元。2024年5月,Penpie平台新增了推出了无需许可的资产池功能,即允许Pendle上的用户可以在该平台上自建任何PT或YT......
  • Java并发编程 - JUC介绍、JUC锁(公平锁、非公平锁、可重入锁/递归锁、自旋锁、Reentran
    Java并发编程中的java.util.concurrent(简称JUC)包提供了许多高级并发工具和类,使得开发人员能够更加方便地编写高性能的并发程序。下面将详细介绍JUC包中的一些锁相关的概念和类。JUC介绍java.util.concurrent包提供了许多高级并发工具类,包括但不限于Executor框架......
  • Java Reentrantlock可重入锁原理 | 源码探究
    一、基本概念ReentrantLock是Java中提供的一个可重入互斥锁,它是java.util.concurrent.locks包中的一个接口Lock的实现类。ReentrantLock提供了比使用synchronized关键字更强大的锁定机制,例如 公平锁 和 非公平锁 选择、尝试锁定、可中断锁定等。ReentrantLock......