面试官: 有了解过ReentrantLock的底层实现吗?说说看

前言

目前正在出一个Java多线程专题长期系列教程,从入门到进阶含源码解读, 篇幅会较多, 喜欢的话,给个关注❤️ ~

源码剖析

上节带大家学习了它的基本使用,我们可以了解到它是一个可重入锁,下面我们就一起看一下它的底层实现~

构造函数

我们在使用的时候,都是先new它,所以我们先看下它的构造函数,它主要有两个:

static final class FairSync extends Sync {
        private static final long serialVersionUID = -3000897897090466540L;

        // 这个方法最终调用 tryAcquire
        final void lock() {
            acquire(1);
        }

        // 公平锁的实现
        protected final boolean tryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            // 这边和非公平锁的实现有些相似 同样判断状态
            if (c == 0) {
                // 判断排队队列是否存在, 不存在并且比较期望值
                if (!hasQueuedPredecessors() &&
                    compareAndSetState(0, acquires)) {
                    // 设置独占线程 并返回成功
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            // 这边和上面类似
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0)
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }
    }

它的实现比较简单,通过实现可以发现,它按照申请锁的顺序来获取锁,排第一的先拿到锁,再结合上面的概念理解一下,就很好理解了.

释放锁unlock,上面我们已经讲过了~

结束语

本节内容可能有点多,主要是看源码,可以打断点自己调一下, 举一反三,通过源码去理解一下什么是公平锁和非公平锁, ReentrantLock可重入锁体验在哪里。下一节,带大家理解一下CAS与原子操作的概念 ~

往期内容推荐

项目源码(源码已更新 欢迎star⭐️)

  • java-thread-all

  • 地址: https://github.com/qiuChengleiy/java-thread-all.git

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)


本篇文章来源于微信公众号: 程序员皮卡秋



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2023-06-27