跳过到内容

Java中的锁

更新时间:2025/5/13
文章字数:0
阅读时长:0 分钟

ReentrantLock

公平锁

java
public class ReentrantLockTest {
    //表示排到第几个人了
    volatile static int index = 0;
    //卫生间门上有个锁,人民素质高: true, 素质低: false
    static ReentrantLock lock = new ReentrantLock(true);

    public static void main(String[] args) {
        start();
    }

    /**
     * 开始活动
     */
    private static void start() {
        //下面实例化来卫生间的路线,有3个路线可以过来
        new Thread(() -> {
            for (; ; ) {
                doing(index++);
            }
        }).start();
        new Thread(() -> {
            for (; ; ) {
                doing(index++);
            }
        }).start();
        new Thread(() -> {
            for (; ; ) {
                doing(index++);
            }
        }).start();
    }

    /**
     * 上厕所这个动作
     */
    private static void doing(int person) {
        lock.lock();
        System.out.println("第 " + person + " 个人去了" + Thread.currentThread().getName() + " 坑位!");
        try {
            System.out.println("上卫生间中,顺便抽烟!");
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("第 " + person + " 个人完事了!");
        System.out.println("----------------------------");
        lock.unlock();
    }
}
//第 0 个人去了Thread-0 坑位!
//上卫生间中,顺便抽烟!
//第 0 个人完事了!
//    ----------------------------
//第 1 个人去了Thread-1 坑位!
//上卫生间中,顺便抽烟!
//第 1 个人完事了!
//    ----------------------------
//第 2 个人去了Thread-2 坑位!
//上卫生间中,顺便抽烟!
//第 2 个人完事了!
//    ----------------------------
//第 3 个人去了Thread-0 坑位!
//上卫生间中,顺便抽烟!
//第 3 个人完事了!
//    ----------------------------
//第 4 个人去了Thread-1 坑位!
//上卫生间中,顺便抽烟!
//第 4 个人完事了!
//    ----------------------------
//第 5 个人去了Thread-2 坑位!
//上卫生间中,顺便抽烟!

从执行结果可以看出来,Thread-0、Thread-1、Thread-2交替执行,很有规律,每次都是上一个人的后面,1 2 3 4 5 有顺序的,这就是公平锁。

非公平锁

java
public static void main(String[] args) {
    // 我们把实例化 ReentrantLock 的参数改为 false 来看看。
    static ReentrantLock lock = new ReentrantLock(false);
}
//第 0 个人去了Thread-0 坑位!
//上卫生间中,顺便抽烟!
//第 0 个人完事了!
//    ----------------------------
//第 3 个人去了Thread-0 坑位!
//上卫生间中,顺便抽烟!
//第 3 个人完事了!
//    ----------------------------
//第 4 个人去了Thread-0 坑位!
//上卫生间中,顺便抽烟!
//第 4 个人完事了!
//    ----------------------------
//第 5 个人去了Thread-0 坑位!
//上卫生间中,顺便抽烟!
//第 5 个人完事了!
//    ----------------------------
//第 6 个人去了Thread-0 坑位!
//上卫生间中,顺便抽烟!

从执行结果可以看出,第1个人和第2个人没抢到坑位,第4、5、6个人也是 Thread-0 路线来的,所以 Thread-1 和 Thread-2 的人基本上 “憋死了”。