揭开可重入锁的谜团

100 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

揭开可重入锁的谜团

对于java方向的朋友来说,一提起锁的话,应该最经典的就是synchronized了;可是如果有人问什么是可重入锁呢?

java中的synchronized是可重入锁吗?

今天咱们就一起来学习一下什么是可重入锁以及为什么锁需要可重入,一起揭开可重入锁的谜团。

什么是可重入锁?

可能有一些小伙伴在这之前都没有听说个可重入锁这个概念;所以在这里我们一起来简单地回顾一下什么叫可重入锁:

可重入锁,简单点来说其实就是同一个线程可以多次获得同一把锁;或者可以用以下不太严谨的话来理解:

对于一把锁A,线程1已经获得了锁A了,在这种状态下,因为某个原因,线程1需要再次获取锁A;这时候线程1如果还能获取到锁A,则说明锁A是可重入的,否则说明锁A是不可重入的。

synchronized是可重入锁吗?

其实synchronized是可重入锁来的,也就是说已经获取了synchronized锁的线程还可以再次获取到该synchronized锁。

下面我们一起来看看一个非常典型的例子:

public class SupperTest {
        public synchronized void toDo() {
            ...
        }
}
 public class SubTest extends SupperTest {
        public synchronized void toDo() {
            //如果这里的synchronized锁是不可重入的,则会出现循环等待
            super.toDo();       
        }
}

可以看到SupperTest中的toDo方法已经加了synchronized,而 SubTest 继承自SupperTest,所以它的toDo方法也是带着synchronized锁的,而且这两个synchronized锁是同一把锁。

所以上述代码的具体流程就是:

  1. 子类中执行到todo方法前获取synchronized锁
  2. 进入到函数体内部,这时候可以开始执行 super.toDo(); 而要执行这个语句,则需要再次获取刚刚那个synchronized锁
  3. 锁可重入,synchronized锁再次获取到了;这时候程序就可以继续往下执行了。

总结

今天我们就一起学习了什么是可重入锁,知道可重入锁就是指同一个线程可以多次获得同一把锁;与此同时,我们也知道了synchronized锁其实是可重入的!