代码实例详解【可重入锁】和【不可重入锁】区别?

简介: 代码实例详解【可重入锁】和【不可重入锁】区别?

首先我们要明白锁的概念,在多线程的场景下,不同的线程一起运行会导致脏数据,为了保证线程安全,这时候便出现了锁的概念,锁可以对代码块,资源,对象上锁,上锁之后,只允许一个线程对其进行操作,其他线程都会进入阻塞状态,这也就是阻塞加锁方法,直到锁释放之后,其他线程才可以获取锁对其操作。


之前文章重点单独介绍过Synchronized和Reentrantlock,不明白的同学可以先看看了解:


currentHashMap的公平锁,可中断响应,限制等待实例


这篇文章主要是介绍可重入锁和不可重入锁,在jdk中synchronized和Reentrantlock,都是可重入锁,为了更高效的性能和防止发生死锁。


可重入锁可以理解为:同一个线程下,外层方法上锁之后,内层调用的方法也能正常获取锁。


下面先用代码介绍对【不可重入锁】的理解。

image.png

当testA()方法获取锁之后,在业务里调用testB(),此时因为A的锁未释放,所以B不能获取到锁,这时候B的业务不能正常进行下去,导致A也不能正常释放锁,A和B方法就发生了死锁。这就是不可重入锁。


可重入锁是什么呢?


Jdk中带的基本都是可重入锁,下面就用synchronized实例介绍,在锁住同一个object之后,控制台打印可以看出,threadA调用threadB方法,B和A方法不会发生死锁,业务都能进行下去。


image.png


我们自己可以用synchronized + wait + notify来实现不可重入锁,代码如下:

image.png

相关文章
|
3月前
|
存储 Java 程序员
synchronized的原理以及与ReentrantLock的区别
`synchronized`和`ReentrantLock`均为Java线程同步机制,确保共享资源的单一时刻独占访问。`synchronized`关键字直接嵌入JVM,可通过修饰方法或代码块实现对象锁或监视器锁,具备可重入性,依赖Mark Word进行锁状态管理。`ReentrantLock`则需显式调用`lock()`和`unlock()`,提供更灵活控制,如公平锁、尝试锁及条件变量。两者在语法、灵活性和异常处理上有所差异,但均支持可重入性。性能方面,随JDK优化,`synchronized`在某些场景下甚至优于`ReentrantLock`。选择使用哪个取决于具体需求和上下文。
|
4月前
|
安全 Java 开发者
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
Java多线程:synchronized关键字和ReentrantLock的区别,为什么我们可能需要使用ReentrantLock而不是synchronized?
59 0
|
6月前
|
Java
从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
【5月更文挑战第6天】从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
36 1
|
6月前
|
安全 Java 测试技术
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
|
6月前
|
存储 安全 Linux
一文搞懂可重入和线程安全
一文搞懂可重入和线程安全
145 0
|
6月前
|
Java
Java多线程同步锁、Lock锁和等待唤醒机制及代码演示
Java多线程同步锁、Lock锁和等待唤醒机制及代码演示
132 0
图解ReentrantLock底层公平锁和非公平锁实现原理
图解ReentrantLock底层公平锁和非公平锁实现原理
182 0
|
监控 安全 Java
自旋锁的伪代码实现,CAS的ABA问题,JUC常见类:Callable,ReentrantLock,线程创建方法的总结,信号量,原子类的应用场景,特定场所的组件CountDomLatch,针对集合类的
自旋锁的伪代码实现,CAS的ABA问题,JUC常见类:Callable,ReentrantLock,线程创建方法的总结,信号量,原子类的应用场景,特定场所的组件CountDomLatch,针对集合类的
|
算法
ReentrantLock 是如何实现可重入性的?
ReentrantLock 是如何实现可重入性的?
58 0
可重入读写锁ReentrantReadWriteLock的demo使用
可重入读写锁ReentrantReadWriteLock的demo使用