ReentrantLock可重入锁Demo

266 阅读1分钟
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockTest {
    public static ReentrantLock reenT = new ReentrantLock();//参数默认false,不公平锁
    public static void main(String[] args) {
    
        Thread t1 = new Thread(() -> {
             reenT.lock();
             System.out.println(Thread.currentThread().getName() + " 获得了锁");
             reenT.lock();
             System.out.println(Thread.currentThread().getName() + " 获得了锁");
             reenT.unlock();
             System.out.println(Thread.currentThread().getName() + " 释放了锁");
         });
        Thread t2 = new Thread(() -> {
            reenT.lock();
            System.out.println(Thread.currentThread().getName() + " 获得了锁");
            reenT.unlock();
        });
        Thread t3 = new Thread(() -> {
            reenT.lock();
            reenT.lock();
        });
        t1.start();
        t2.start();
        Thread.sleep(2000L);
        System.out.println("线程t1: " + t1.getState().toString());
        System.out.println("线程t2: " + t2.getState().toString());
    }
}
>
Thread-0 获得了锁
Thread-0 获得了锁
Thread-0 释放了锁
线程t1: TERMINATED
线程t2: WAITING

上述代码中,t1调用了2次lock(), 因为是可重入锁。 但是只调用了一次unlock()。t1执行完后进入TERMINATED状态,最后没有释放锁。 所以t2一直处于WAITING状态。

倘若t1调用2次unlock(),那么t2就有机会获得锁了。