ReentrantLock 和synchronized 都是 可重入锁
1、synchronized可重入锁示例
public class synchronizedTest implements Runnable {
@Override
public void run() {
test1();
}
public static void main(String[] args) {
synchronizedTest test= new synchronizedTest();
Thread t1=new Thread(test).start();
Thread t2=new Thread(test).start();
}
public synchronized void test1() {
System.out.println(Thread.currentThread().getName());
test2();
}
public synchronized void test2() {
System.out.println(Thread.currentThread().getName());
}
}
2、ReentrantLock可重入锁示例
public class ReentrantLockTest implements Runnable {
ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
test1();
}
public static void main(String[] args) {
ReentrantLockTest test = new ReentrantLockTest();
Thread t1=new Thread(test).start();
Thread t2=new Thread(test).start();
}
public void test1() {
lock.lock();
System.out.println(Thread.currentThread().getName());
test2();
lock.unlock();
}
public void test2() {
lock.lock();
System.out.println(Thread.currentThread().getName());
lock.unlock();
}
}
3、可重入锁原理:
为每个锁关联一个获取计数值和一个所有者的线程。当计数值为0时,该锁未被任何线程持有。当一个线程请求一个未被持有的锁时,JVM会记下锁的持有者和计数值+1 ,如果是同一个线程再次获取这个锁时,计数值递增。当线程退出同步代码块时,计数值递减。当计数值为0时,这个锁被释放。
redis分布式锁的支持的可重入性,也是相同思想