什么是可重入,什么是可重入锁? 它用来解决什么问题?
可重入
可重入是多线程并发编程里面一个比较重要的概念,简单来说,就是在运行的某个函数或者代码,因为抢占资源或者中断等原因导致函数或者代码的运行中断,等待中断程序执行结束后,重新进入到这个函数或者代码中运行,并且运行结果不会受到影响,那么这个函数或者代码就是可重入的。
可重入锁
而可重入锁,简单来说就是一个线程如果抢占到了互斥锁资源,在锁释放之前再去竞争同一把锁的时候,不需要等待,只需要记录重入次数。在多线程并发编程里面,绝大部分锁都是可重入的,比如 Synchronized、ReentrantLock 等,但是也有不支持重入的锁,比如 JDK8 里面提供的读写锁StampedLock。
public static synchronized void lock1(){
// ThreadX 获取到了lock1中的Synchronized锁,
// 再次调用另外一个加同步锁的lock2()方法
lock2();
}
public static synchronized void lock2(){
//doSomething
}
锁的可重入性,主要解决的问题是避免线程死锁的问题。 因为一个已经获得同步锁 X 的线程,在释放锁 X 之前再去竞争锁 X 的时候,相当于会出现自己要等待自己释放锁,这很显然是无法成立的。