Java多线程基础知识之可重入锁和非可重入锁

可重入锁和不可重入锁的概念:

1.可重入锁:

所谓可重入锁,意味着线程可以进入它已经拥有的锁的同步代码块儿.

2.非可重入锁

所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞.

3.说明:

(1)可重入锁就是一个类有A、B方法,A、B都有获得同一把锁,当A方法调用时获得锁,在A方法的锁还没有被释放时,调用B方法时,B方法也能获得该锁.

这种情景,可以是不同的线程分别调用这两个方法;也可以是同一个线程,A方法中调用B方法,B方法中调用A方法.

(2)不可重入锁就是一个类的A、B两个方法,A、B都有获得同一把锁,当A方法调用时获得锁,在A方法的锁还没有被释放时,调用B方法时,B方法不能获得该锁,必须等A方法释放掉这个锁后在获得该锁.

当一个线程获得当前实例的锁lock,并且进入了方法A,该线程在方法A没有释放该锁的时候,是否可以再次进入使用该锁的方法B?

不可重入锁:在方法A释放锁之前,不可以再次进入方法B

可重入锁:在方法A释放该锁之前可以再次进入方法B

4.区别:

可重入锁和非可重入锁区别:简单来说,就是可重入锁会有多个属性:(1)获得该锁的线程(2)获得该锁的次数;根据第一个属性判断,如果持有该锁的那个线程又来lock,不会被阻塞(wait),而是在上锁的次数加一(表示这个线程又锁了一次(重入)),而且只有该线程unlock的次数达到上锁的次数(即第二个属性等于0),才会唤醒其他线程.

java中常用的可重入锁:

synchronized

java.util.concurrent.locks.ReentrantLock

Guess you like

Origin blog.csdn.net/u012556114/article/details/111148138