一、概念
线程在方法外获得锁进入方法内,如果需要再次获得锁,那么就会自动获取(前提是同一个锁对象),不会因为之前获取过锁还没释放而阻塞
二、种类
Java中ReentrantLock和synchronized都是可重入锁。
隐式锁(synchronized)
显示锁(Lock,即需要手动lock和unlock的锁)中的ReentrantLock
三、伪代码演示
1.隐式锁
public class ReentrantDemo
static Object objectA = new Object();
static void test()
{
synchronized(objectA)
{
System.out.print(Thread.currentThread()+"获得锁,进入同步方法");
synchronized(objectA)
{
System.out.print(Thread.currentThread()+"同一把锁,自动获得,进入内部");
}
}
psvm{
}
}
2.显示锁
注意 Lock::lock次数要和Lock::unlock次数对应,不然会发生死锁
四、逻辑过程
每一个锁对象拥有一个锁计数器和一个指向持有该锁的线程的指针
当执行moniterenter:
if(计数器 == 0)
{
锁.线程指针 = 当前线程;
计数器++;
}
else
{
if(锁.线程指针 == 当前线程) 计数器++;
else 阻塞,直到计数器为0;
}
当执行monitorexit
计数器--
if(计数器 == 0)
{
锁.线程指针 == null
}