可重入锁,从字面来理解,就是可以重复进入的锁。

可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响。

在JAVA环境下ReentrantLocksynchronized都是可重入锁。

synchronized是一个可重入锁。在一个类中,如果synchronized方法1调用了synchronized方法2,方法2是可以正常执行的,这说明synchronized是可重入锁。否则,在执行方法2想获取锁的时候,该锁已经在执行方法1时获取了,那么方法2将永远得不到执行。

可重入锁在什么场景使用呢?

可重入锁主要用在线程需要多次进入临界区代码时,需要使用可重入锁。具体的例子,比如上文中提到的一个synchronized方法需要调用另一个synchronized方法时。

可重入锁的实现原理是怎么样的?

加锁时,需要判断锁是否已经被获取。如果已经被获取,则判断获取锁的线程是否是当前线程。如果是当前线程,则给获取次数加1。如果不是当前线程,则需要等待。

释放锁时,需要给锁的获取次数减1,然后判断,次数是否为0了。如果次数为0了,则需要调用锁的唤醒方法,让锁上阻塞的其他线程得到执行的机会。

什么是可重入锁?为什么需要可重入锁?相关推荐

  1. 谈谈java并发锁(重入锁、读写锁、公平锁)

    目录 重入锁 简单重入锁 重入锁的等待通知(Condition) 多Condition 公平锁和非公平锁 读写锁ReentrantReadWriteLock 锁优化总结: 重入锁和读写锁,他们具有比s ...

  2. java 并发锁_Java并发教程–重入锁

    java 并发锁 Java的synced关键字是一个很棒的工具–它使我们可以通过一种简单可靠的方式来同步对关键部分的访问,而且也不难理解. 但是有时我们需要对同步进行更多控制. 我们要么需要分别控制访 ...

  3. zbb20180929 thread 自旋锁、阻塞锁、可重入锁、悲观锁、乐观锁、读写锁、对象锁和类锁...

    1.自旋锁 自旋锁可以使线程在没有取得锁的时候,不被挂起,而转去执行一个空循环,(即所谓的自旋,就是自己执行空循环),若在若干个空循环后,线程如果可以获得锁,则继续执行.若线程依然不能获得锁,才会被挂 ...

  4. 锁-概念:可重入锁、可中断锁、公平锁、读写锁

    可重入锁 指的是在同一个thread中,获取锁之后再次使用同样的方法或对象中的其他方法可以直接操作,而不需要重新获取锁.它是基于thread粒度的,per-thread. 不可重入锁 指的是每次使用锁 ...

  5. java dom4j读写锁,java锁的深度化-重入锁,读写锁,乐观锁,悲观锁

    1.重入锁 目的:避免死锁的现象 锁作为并发共享数据,保证一致性的工具,在java平台有多种实现synchronized(重量级)和ReentrantLock(轻量级)等等,这些已经写好提供的锁为我们 ...

  6. Redis核心数据结构List应用场景-商品列表、缓存击穿、PV阅读量、抢红包、推送帖子、普通分布式锁、Redis可重入锁与红锁

    List应用场景 Redis之List 一. Redis list命令实战 二.商品列表 高并发的淘宝聚划算实现技术方案 SpringBoot+Redis实现商品列表功能 二.缓存击穿 什么是缓存击穿 ...

  7. 可重入锁-synchronized是可重入锁吗?

    目录 前言 1.什么是可重入锁呢? 2.自己写代码验证下可重入和不可重入 3.自己如何实现一个可重入和不可重入锁呢 4.ReentrantLock如何实现可重入的 5.可重入锁的特点 前言 面试题:s ...

  8. redis分布式锁之redisson可重入锁

    1.上篇讲了java里使用setNX实现redis分布式锁,可是这种方法还是有很多弊端的,追求完美的做法可以使用redisson来实现分布式锁,如下: 2.Redisson 是 java 的 Redi ...

  9. 可重入锁与非可重入锁

    文章目录 锁的分类 什么是可重入锁 测试lock 锁的可重入性 不可重入锁 锁的分类 什么是可重入锁 可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前 ...

最新文章

  1. springboot 集成jpa_基于Spring Boot+JPA Restful 风格的数据
  2. 2021年,让OKR帮你完成晋升
  3. wangEditor 上传图片,回调函数 Cannot read properties of undefined
  4. 谷歌大脑2017总结下篇:从医疗、机器人等6个领域开始的改变世界之旅
  5. Altium Designer Winter09 的使用心得
  6. Quartz-JobListener解读
  7. 关于浏览器模式和文本模式的困惑
  8. 图像处理中的通信原理——冈萨雷斯读书笔记(二)
  9. java注释指导手册
  10. IIS7安装URLReWrite的妙用
  11. Java多线程编程-停止线程 暂停线程
  12. filezilla显示乱码(已解决)
  13. R语言caret包preProcess()标准化出现错误: Matrices or data frames are required for preprocessing
  14. 页面打印不全怎么办html css,win7打印网页显示不全怎么办|win7设置网页打印页面的方法...
  15. 【白皮书】以太坊 (Ethereum ):下一代智能合约和去中心化应用平台
  16. bailian.openjudge 2692:假币问题
  17. 手机实现实时人脸识别(二)
  18. 小米2s刷原生安卓_小米2/2S刷原生安卓Android4.4ROM刷機教程
  19. 【python】判断闰年
  20. JAVA语言规范 JAVA SE 8 - 类型、值和变量

热门文章

  1. 【CEGUI】CEGUI入门篇之创建window(四)
  2. 课堂随机提问回答问题神器三
  3. 增大/减少Mp3文件的默认音量—令其统一音量
  4. 英伟达研究生奖学金名单公布:多位华人获选,每人5万美元
  5. 世纪佳缘信息爬取存储到mysql,下载图片到本地,从数据库选取账号对其发送消息更新发信状态...
  6. v-infinite-scroll无限滚动无法触发
  7. 工具软件 PYUV打开raw图片
  8. DELL 15R 7520 UEFI引导Clover安装Yosemite 10.10.2实录,基本完美
  9. 找规律2 2 3 4 9 32
  10. s5pv210-linux5.17移植