文章目录

  • 锁的分类
  • 什么是可重入锁
  • 测试lock 锁的可重入性
  • 不可重入锁

锁的分类

什么是可重入锁

可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。

  • ReentrantLock和synchronized都是重入锁,

  • 可重入锁的好处:【1.避免死锁】【2.提升封装性】

案例实现

  • 电影院预定预定电影院座位

预定座位就是个很好的lock锁场景,预定座位,其实这个背后就是上锁了


首先ReentrantLock和NonReentrantLock都继承父类AQS,其父类AQS中维护了一个同步状态status来计数重入次数,status初始值为0。
当线程尝试获取锁时,可重入锁先尝试获取并更新status值,如果status == 0表示没有其他线程在执行同步代码,则把status置为1,当前线程开始执行。如果status != 0,则判断当前线程是否是获取到这个锁的线程,如果是的话执行status+1,且当前线程可以再次获取锁。而非可重入锁是直接去获取并尝试更新当前status的值,如果status != 0的话会导致其获取锁失败,当前线程阻塞。
释放锁时,可重入锁同样先获取当前status的值,在当前线程是持有锁的线程的前提下。如果status-1 == 0,则表示当前线程所有重复获取锁的操作都已经执行完毕,然后该线程才会真正释放锁。而非可重入锁则是在确定当前线程是持有锁的线程之后,直接将status置为0,将锁释放。

测试lock 锁的可重入性

我们使用 lock.getHoldCount() 打印下获取锁的次数
多次获取锁,与释放锁

会发现锁不用等待,下一次依然可以获取到锁,这就是锁的可重入锁性

不可重入锁

不可重入锁,与可重入锁相反,不可递归调用,递归调用就会发生死锁。

可重入锁与非可重入锁相关推荐

  1. java中的锁(悲观锁、乐观锁、可重入锁、不可重入锁、公平锁、非公平锁、自旋锁、阻塞锁...)

    Lock接口 1.简介.地位.作用 ① 锁是一种工具,用于控制对共享资源的访问 ② Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用和功能上又有较大的不 ...

  2. 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)

    线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...

  3. java分类锁_【基本功】java锁分类详解

    [基础课]--[锁]--锁分类​mp.weixin.qq.com 前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自J ...

  4. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  5. Java进阶:ReentrantLock实现原理解析(公平锁、非公平锁、可重入锁、自旋锁)

    概述 本篇将介绍公平锁.非公平锁.可重入锁.自旋锁相关理论知识,同时结合相关源码和Demo进行解析,主要是以ReentrantLock作为例子. 公平锁 公平锁定义 公平锁是指线程按照申请所的顺序来获 ...

  6. 线程调度、公平锁和非公平锁、乐观锁和悲观锁、锁优化、重入锁

    1. 线程调度 线程调度指的就是给线程分配使用处理器的过程.主要的调度方式有两种:协同式调度和抢占式调度. 1.1 协同式调度 线程完成自己的任务之后主动通知系统切换到另一个线程上. 优点: 实现简单 ...

  7. java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...

    一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...

  8. Juc07_乐观锁和悲观锁、公平锁和非公平锁、递归锁(可重入锁)、死锁及排查、自旋锁

    文章目录 ①. 乐观锁和悲观锁 ②. 公平锁和非公平锁 ③. 可重入锁(又名递归锁) ④. 死锁及排查 ⑥. 自旋锁 ①. 乐观锁和悲观锁 ①. 悲观锁(synchronized关键字和Lock的实现 ...

  9. 可重入锁的理解及公平锁和非公平锁的具体实现

    可重入锁 首先结合以下两个例子理解以下可重入锁的概念. /*** 可重入锁:* 1.可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁.* 2.是指在同 ...

最新文章

  1. Unicode与UTF-8互转(C语言实现)
  2. 一篇文章让你真正了解Java
  3. java 里如何实现逻辑返回值_☆技术问答集锦(五)
  4. zjnu1730 PIRAMIDA(字符串,模拟)
  5. cmu的计算机专业项目有哪些,CMU卡耐基梅隆大学计算机学院项目介绍(一)
  6. mysql国内源码安装,mysql 源码包安装
  7. 相信阿里只会PPT的“假专家”,随意做数字化转型,活该失败
  8. 如何看数据库是否处在force_logging模式下
  9. 一次完整的react hooks实践
  10. Spring源码下载及安装
  11. uni-app 项目创建 (简单+明确!!!)
  12. 25.人脸关键点检测
  13. 笔记本电脑处理器(CPU)性能排行榜
  14. 知识付费的本质是什么?现在入行知识付费行业晚吗?
  15. 用Python做一个简陋的文本编辑器
  16. AndroidEventBus(事件总线)了解+实战体验
  17. 表格拆分的两种方式 拆分成多个excel工作表或多个excel文件
  18. 菜刀连接图片一句话木马
  19. 持币大户谈PRS投资策略
  20. 微软CCID智能卡读卡器驱动(Microsoft Class Drivers for USB CCID Smart Cards)

热门文章

  1. DotNetBar教程(一)
  2. JavaScript刷新当前页面的三种方法,载入新文档替换当前页面
  3. 学系统集成项目管理工程师(中项)系列11b_沟通管理(下)
  4. 杭电ACM-LCY算法进阶培训班-专题训练(线段树)
  5. vs2019 使用 SHFB-Sandcastle Help File Build 文档生成工具 自动生成程序文档
  6. HDFS分布式文件存储系统详解
  7. 达梦数据库创建表空间,用户,模式
  8. java jute_ZooKeeper源码分析-Jute-第一部分
  9. 上海生日当天必去揩油的地方
  10. Zepto.js 3D图片轮播旋转插件