什么是可重入锁?为什么需要可重入锁?

本文介绍了可重入锁的概念及其实现原理,并通过Java中的synchronized关键字为例详细解释了其工作方式。此外,还探讨了可重入锁的适用场景。

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

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

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

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

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

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

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

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

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

### 可重入性的定义 可重入性是指一个线程在持有某个的情况下,可以再次获取该而不会导致阻塞或死的能力。这种特性对于避免线程在执行嵌套调用或递归调用时因多次请求同一而陷入死循环至关重要。如果不支持可重入性,线程在尝试获取已经持有的时会被阻塞,从而导致自身无法继续执行,形成所谓的“自己死自己”的情况。 ### Synchronized实现可重入的原理 在Java中,`synchronized`关键字实现的机制是典型的可重入。其底层实现依赖于监视器(Monitor)机制,并通过与对象关联的状态来管理线程的访问。具体来说,每个对象都有一个与之绑定的计数器(status),用于记录当前线程获取该的次数。 当一个线程尝试进入由`synchronized`修饰的方法或代码块时,它会检查该对象的状态: - 如果状态为0,表示该未被任何线程占用,线程可以通过CAS操作(Compare and Swap)将状态设置为1,并记录自己的线程ID,从而成功获取。 - 如果状态不为0,且当前线程ID与持有的线程ID相同,则线程会增加状态的计数器(即`status`值加1),并继续执行代码。这一机制确保了线程可以在不释放的情况下多次进入同步区域,从而支持了可重入性。 - 如果状态不为0且当前线程ID与持有的线程ID不同,则线程会被阻塞,直到被释放。 当线程退出同步代码块时,它会减少状态的计数器。只有当计数器减至0时,才会被完全释放,其他等待的线程才能尝试获取该。 ### 示例代码 以下是一个简单的示例,展示了`synchronized`如何在方法调用中体现可重入性: ```java public class ReentrantExample { public synchronized void method1() { System.out.println("Executing method1"); } public synchronized void method2() { System.out.println("Executing method2"); method1(); // 调用另一个同步方法 } public static void main(String[] args) { ReentrantExample example = new ReentrantExample(); Thread thread = new Thread(() -> example.method2()); thread.start(); } } ``` 在这个例子中,`method2`是一个同步方法,在调用过程中又调用了另一个同步方法`method1`。由于`synchronized`支持可重入性,当前线程在已经持有的情况下可以再次获取同一对象的,从而顺利执行`method1`。 ### 总结 通过上述机制,`synchronized`确保了线程在嵌套调用或递归调用中能够多次获取同一对象,避免了线程因自身多次请求而导致的阻塞问题。这种设计不仅简化了并发编程的复杂性,还有效防止了死的发生。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值