我们熟悉的synchronized、ReentrantLock都是可重入锁(又称递归锁)
例子:synchronized实现
package com.lzy.test;
/**
*可重入锁(可以说是递归锁)
*线程可以进入任何一个已经拥有锁的同步代码块
*/
public class LockDemo {
public synchronized void method1(){
System.out.println(Thread.currentThread().getId()+"线程-method1");
method2();
}
public synchronized void method2(){
System.out.println(Thread.currentThread().getId()+"线程-method2");
}
public static void main(String[] args) {
LockDemo lockDemo =new LockDemo();
new Thread(()->{
lockDemo.method1();
},"thread-1").start();
new Thread(()->{
lockDemo.method1();
},"thread-2").start();
}
}
结果:
12线程-method1
12线程-method2
13线程-method1
13线程-method2
例子:ReentrantLock实现
package com.lzy.test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockDemo2 implements Runnable{
private Lock lock=new ReentrantLock();
public void method1(){
lock.lock();
try {
System.out.println(Thread.currentThread().getId()+"线程-method-1");
method2();
}finally {
lock.unlock();
}
}
public void method2(){
lock.lock();
try {
System.out.println(Thread.currentThread().getId()+"线程-method-2");
}finally {
lock.unlock();
}
}
@Override
public void run() {
method1();
}
public static void main(String[] args) {
LockDemo2 lock=new LockDemo2();
new Thread(lock,"thread-1").start();
new Thread(lock,"thread-2").start();
}
}
结果:
12线程-method-1
12线程-method-2
13线程-method-1
13线程-method-2
总结
可重入锁就是在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。ReentrantLock和synchronized都是可重入锁