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

可重入锁

时间:2023-12-12 22:57:38浏览次数:27  
标签:重入 可重 synchronized 递归 lock static public

可重⼊锁(⼜名递归锁)

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

 

如果是1个有 synchronized 修饰的递归调⽤⽅法,程序第2次进⼊被⾃⼰阻塞了岂不是天⼤的笑话,出现了作茧⾃缚。所以Java中ReentrantLock和synchronized都是可重⼊锁,可重⼊锁的⼀个优点是可⼀定程度避免死锁。

同步块

1、“可重⼊锁”这四个字分开来解释:

2、可重⼊锁种类

1、隐式锁(即synchronized关键字使⽤的锁)默认是可重⼊锁

指的是可重复可递归调⽤的锁,在外层使⽤锁之后,在内层仍然可以使⽤,并且不发⽣死锁,这样的锁

就叫做可重⼊锁。

简单的来说就是:在⼀个synchronized修饰的⽅法或代码块的内部调⽤本类的其他synchronized

修饰的⽅法或代码块时,是永远可以得到锁的

与可重⼊锁相反,不可重⼊锁不可递归调⽤,递归调⽤就发⽣死锁。

可:可以。

重:再次。

⼊:进⼊。

锁:同步锁。

进⼊什么:进⼊同步域(即同步代码块/⽅法或显式锁锁定的代码)

⼀句话:⼀个线程中的多个流程可以获取同⼀把锁,持有这把同步锁可以再次进⼊。

⾃⼰可以获取⾃⼰的内部锁

2.显式锁(即Lock)也有ReentrantLock这样的可重⼊锁。

public class Demo4 {

private static int num = 0;

private static ReentrantLock lock = new ReentrantLock();

private static void add() {

lock.lock();

lock.lock();

try {

num++;

} finally {

lock.unlock();

lock.unlock();

}

}

public static class T extends Thread {

@Override

public void run() {

for (int i = 0; i < 10000; i++) {

Demo4.add();

}

}

}

public static void main(String[] args) throws InterruptedException {

T t1 = new T();

T t2 = new T();

T t3 = new T();

t1.start();

t2.start();

t3.start();

t1.join();

t2.join();

t3.join();

System.out.println(Demo4.num);

}

}

标签:重入,可重,synchronized,递归,lock,static,public
From: https://www.cnblogs.com/lin513/p/17898044.html

相关文章

  • ReenTrantLock可重入锁(和synchronized的区别)总结
    可重入性:从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。锁的实现:Synchronized是依赖于JVM实现的,而ReenTra......
  • 操作系统的抢占、重入
    参考:https://blog.csdn.net/m0_64727117/article/details/130976784一、抢占式内核、抢占式调度、抢占式中断:某一中断执行完成后,如果有更高优先级的任务处于就绪状态,将执行更高优先级任务。抢占式内核的优点:(1)最高优先级的任务什么时候可以执行,可以得到CPU的使用权是已知的......
  • 可重入锁ReentrantLock在性能测试常见用法
    在进行Java多线程编程的过程中,始终绕不开一个问题:线程安全。一般来说,我们可以通过对一些资源加锁来实现,大多都是通过synchronized关键字实现。在做性能测试时,如果TPS或者QPS要求没有特别高,synchronized一招鲜基本也能满足大部分的需求了。对于一招鲜无法很好解决的问题,就需要......
  • Redis学习之Redisson实现可重入锁
    如何实现可重入锁目的:保证同一个线程可以多次获取同一把锁解决思路:在锁的value中额外保存当前线程获取锁的次数,每次获取锁+1、释放锁-1,当次数为0时才真正删除key。采用hash结构来存储锁信息,如图:流程如下:注意:所有的判断和操作都需要使用Lua脚本来保证原子性每......
  • c语言的可重入和不可重入函数
    先贴上一篇优秀的博文链接:C语言之可重入函数和不可重入函数_c可重入函数_KiranWang的博客-CSDN博客  总结:不可重入函数的四种情况1.静态数据结构:如静态局部变量活全局变量2.malloc()或者free()函数因为这两个函数都会操作全局的链表,如果第一次malloc没结束时,再被一次malloc......
  • golang简单实现CLHLock,不可重入的clh自旋锁
    如果不想自旋,可以把Lock、waitIsFinish和noticeIsFinish代码中的方式2注释掉,改用方式1。不过实际测试在低并发的情况下,自旋的执行效率更高,要根据实际业务场景选择使用哪种方式。源代码如下:import("runtime""sync/atomic")const(Gosched_Spin_Count=10000......
  • C++可重入函数和不可重入函数
    转载:https://blog.csdn.net/weixin_41969690/article/details/108006834C++可重入函数和不可重入函数可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果正确不必担心数据错误的函数。不可重入函数是指不能运行在多任务环境下,除非能保证互斥的函数。由于使用......
  • 线程安全和可重入
    线程安全和可重入线程安全定义如果一个函数被多个线程并发执行时,这个函数不会出现异常,则称这个函数是线程安全的。线程安全的破坏如果这个函数被多个线程调用时,可能会修改同一个资源,则就可能破坏线程安全。例如,函数访问全局变量:#include<thread>#include<stdio.h>in......
  • java~理解可重入锁
    在Java中,可重入锁(ReentrantLock)是一种同步机制,允许线程在持有锁的情况下再次获取该锁,而不会被自己所持有的锁所阻塞。也就是说,一个线程可以多次获得同一个锁,而不会出现死锁的情况。可重入锁在多线程编程中非常有用,它允许线程在访问共享资源时多次获取锁,而不会引发死锁问题。当一......
  • Java 多线程同步问题的探究(三、Lock来了,大家都让开【1. 认识重入锁】)
    在上一节中,我们已经了解了Java多线程编程中常用的关键字synchronized,以及与之相关的对象锁机制。这一节中,让我们一起来认识JDK5中新引入的并发框架中的锁机制。我想很多购买了《Java程序员面试宝典》之类图书的朋友一定对下面这个面试题感到非常熟悉:问:请对比synchronized......