欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

简易实例解析:ReentrantLock尝试获取锁(tryLock()方法)

最编程 2024-07-28 19:12:53
...
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockTest {
    public static ReentrantLock reenT = new ReentrantLock();//参数默认false,不公平锁
    public static void test2() throws Exception{
        Thread t0 = new Thread(() -> {
            if (reenT.tryLock()) {
                System.out.println(Thread.currentThread().getName() + " 获得了锁");
                reenT.lock();
                System.out.println(Thread.currentThread().getName() + " 获得了锁");
                reenT.unlock();
                System.out.println(Thread.currentThread().getName() + " 释放了锁");
                reenT.unlock();
                System.out.println(Thread.currentThread().getName() + " 释放了锁");
            }
        });
        Thread t1 = new Thread(() -> {
            if (reenT.tryLock()) {
                System.out.println(Thread.currentThread().getName() + " 获得了锁");
                reenT.unlock();
            }
        });
        Thread t2 = new Thread(() -> {
            reenT.lock();
            System.out.println(Thread.currentThread().getName() + " 获得了锁");
            reenT.unlock();
        });
        t0.start();
        t1.start();
        t2.start();
        Thread.sleep(2000L);
        System.out.println("线程t0: " + t0.getState().toString());
        System.out.println("线程t1: " + t1.getState().toString());
        System.out.println("线程t2: " + t2.getState().toString());
    }

    public static void main(String[] args) {
        try {
            test2();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
> 
Thread-0 获得了锁
Thread-0 获得了锁
Thread-0 释放了锁
Thread-0 释放了锁
Thread-2 获得了锁
线程t0: TERMINATED
线程t1: TERMINATED
线程t2: TERMINATED

t1使用tryLock()方法获取锁,此时锁正被t0所有。因此返回false,代码继续往后执行完毕。 而t2则正常等待锁,获取锁以后才继续执行完毕。