这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战
什么是可重入锁?
- 同一个线程可以重入上锁的代码段,不同的线程则需要进行阻塞
- Java的可重入锁有:ReentrantLock(显式的可重入锁)、synchronized(隐式的可重入锁)
- 可重入锁的最大作用是避免死锁
- 同步锁可以再次进入(同一个线程)
就比如锁方法A上锁lock而方法B也上锁lock,并且在方法A中调用方法B,不会出现死锁的情况,因为它们处于同一个线程用的是同一把锁,所以可重入锁运行再次进入。
不可重入锁
这段代码模拟了不可重入锁的构造,运行后发现出现死锁的情况这是因为在method1方法中上锁之后没有释放,在调用method2的时候内部再一次调用了lock方法,上次method1调用lock方法的时候已经将isLock = true,所以一直处于while循环当中
1 | java复制代码public class NotReentrantLockDemo { |
测试结果:
仅打印this is method1后出现阻塞
可重入锁
1 | java复制代码public class ReentrantLockDemo { |
测试结果:
this is method1
this is method2
解析
可以看到与不可重入锁相比,可重入锁新增两个属性上锁的线程lockThread和上锁的次数lockCount,通过这两个变量的控制实现防止死锁的目的。
synchronized是可重入锁
1 | java复制代码public class ReentrantLockDemo { |
运行结果:
this is method1
12
this is method2
12
ReentrantLock是可重入锁
1 | java复制代码public class ReentrantLockDemo { |
this is process1/t id=13
this is process2/t id=13
本文转载自: 掘金