可重入锁和不可重入锁的概念:
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