可重入锁与非可重入锁

简介: 可重入锁与非可重入锁

@[toc]

锁的分类

在这里插入图片描述

什么是可重入锁

可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者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() 打印下获取锁的次数
多次获取锁,与释放锁

在这里插入图片描述
会发现锁不用等待,下一次依然可以获取到锁,这就是锁的可重入锁性

不可重入锁

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

相关文章
|
9月前
|
存储 安全 Java
aqs原理初探以及公平锁和非公平锁实现
aqs原理初探以及公平锁和非公平锁实现
176 0
|
8月前
|
算法
ReentrantLock 是如何实现可重入性的?
ReentrantLock 是如何实现可重入性的?
39 0
|
10月前
|
安全 Java
synchronized 锁与 ReentrantLock 锁的区别
synchronized 锁与 ReentrantLock 锁的区别
90 0
|
11月前
ReentrantLock是如何实现可重入性
ReentrantLock是如何实现可重入性
56 0
|
12月前
|
安全 Java
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
67 0
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
理论:第十章:公平锁,非公平锁,可重入锁,递归锁,自旋锁,读写锁,悲观锁,乐观锁,行锁,表锁,死锁,分布式锁,线程同步锁分别是什么?
理论:第十章:公平锁,非公平锁,可重入锁,递归锁,自旋锁,读写锁,悲观锁,乐观锁,行锁,表锁,死锁,分布式锁,线程同步锁分别是什么?
ReentrantLock可重入锁、公平锁非公平锁区别与实现原理
ReentrantLock可重入锁、公平锁非公平锁区别与实现原理
|
测试技术 API
Juc并发编程04——可重入锁、公平锁与非公平锁
1.ReentrantLock使用介绍 之前我们一直使用的Lock实例都用的是ReentrantLock,实际上,这是一种可重入锁。简单来说,就是对同一个线程可以进行多次的加锁操作
|
安全 调度
可重入锁
JUC学习
110 0
Java 独占锁与共享锁、公平锁与非公平锁、可重入锁
Java 独占锁与共享锁、公平锁与非公平锁、可重入锁