可重入锁与非可重入锁
文章目录
- 锁的分类
- 什么是可重入锁
- 测试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() 打印下获取锁的次数
多次获取锁,与释放锁
会发现锁不用等待,下一次依然可以获取到锁,这就是锁的可重入锁性
不可重入锁
不可重入锁,与可重入锁相反,不可递归调用,递归调用就会发生死锁。
可重入锁与非可重入锁相关推荐
- java中的锁(悲观锁、乐观锁、可重入锁、不可重入锁、公平锁、非公平锁、自旋锁、阻塞锁...)
Lock接口 1.简介.地位.作用 ① 锁是一种工具,用于控制对共享资源的访问 ② Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用和功能上又有较大的不 ...
- 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)
线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...
- java分类锁_【基本功】java锁分类详解
[基础课]--[锁]--锁分类mp.weixin.qq.com 前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自J ...
- java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)
前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...
- Java进阶:ReentrantLock实现原理解析(公平锁、非公平锁、可重入锁、自旋锁)
概述 本篇将介绍公平锁.非公平锁.可重入锁.自旋锁相关理论知识,同时结合相关源码和Demo进行解析,主要是以ReentrantLock作为例子. 公平锁 公平锁定义 公平锁是指线程按照申请所的顺序来获 ...
- 线程调度、公平锁和非公平锁、乐观锁和悲观锁、锁优化、重入锁
1. 线程调度 线程调度指的就是给线程分配使用处理器的过程.主要的调度方式有两种:协同式调度和抢占式调度. 1.1 协同式调度 线程完成自己的任务之后主动通知系统切换到另一个线程上. 优点: 实现简单 ...
- java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...
一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...
- Juc07_乐观锁和悲观锁、公平锁和非公平锁、递归锁(可重入锁)、死锁及排查、自旋锁
文章目录 ①. 乐观锁和悲观锁 ②. 公平锁和非公平锁 ③. 可重入锁(又名递归锁) ④. 死锁及排查 ⑥. 自旋锁 ①. 乐观锁和悲观锁 ①. 悲观锁(synchronized关键字和Lock的实现 ...
- 可重入锁的理解及公平锁和非公平锁的具体实现
可重入锁 首先结合以下两个例子理解以下可重入锁的概念. /*** 可重入锁:* 1.可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁.* 2.是指在同 ...
最新文章
- Unicode与UTF-8互转(C语言实现)
- 一篇文章让你真正了解Java
- java 里如何实现逻辑返回值_☆技术问答集锦(五)
- zjnu1730 PIRAMIDA(字符串,模拟)
- cmu的计算机专业项目有哪些,CMU卡耐基梅隆大学计算机学院项目介绍(一)
- mysql国内源码安装,mysql 源码包安装
- 相信阿里只会PPT的“假专家”,随意做数字化转型,活该失败
- 如何看数据库是否处在force_logging模式下
- 一次完整的react hooks实践
- Spring源码下载及安装
- uni-app 项目创建 (简单+明确!!!)
- 25.人脸关键点检测
- 笔记本电脑处理器(CPU)性能排行榜
- 知识付费的本质是什么?现在入行知识付费行业晚吗?
- 用Python做一个简陋的文本编辑器
- AndroidEventBus(事件总线)了解+实战体验
- 表格拆分的两种方式 拆分成多个excel工作表或多个excel文件
- 菜刀连接图片一句话木马
- 持币大户谈PRS投资策略
- 微软CCID智能卡读卡器驱动(Microsoft Class Drivers for USB CCID Smart Cards)