ReentrantLock 与 Condition 原理基础解析

问:简单说说 ReentrantLock 和 Condition 的原理?

答:ReentrantLock 锁的实现原理依赖于 CAS、AQS、LockSupport 等。

LockSupport 也位于并发包下,其提供了一组静态方法:

        public class LockSupport {

            //使指定线程恢复运行状态
            public static void unpark(Thread thread) {
                ...
            }

            // 使当前线程放弃CPU进入WAITING等待状态不往下继续执行,
            // 特别注意 park 系列方法是可以响应中断的,
            // 当有中断时 park 方法会返回且线程中断标记被设置,
            // park 还有可能无缘无故返回,程序应该主动检测 park 等待的条件是否满足。
            public static void park(Object blocker) {
                ...
            }

            public static void parkNanos(Object blocker, long nanos) {
                ...
            }

            public static void parkUntil(Object blocker, long deadline) {
                ...
            }

            public static Object getBlocker(Thread t) {
                ...
            }

            public static void park() {
                ...
            }

            public static void parkNanos(long nanos) {
                ...
            }

            public static void parkUntil(long deadline) {
                ...
            }
        }

LockSupport 的 park、unpark 实现都和 CAS 类似基于 Unsafe 类的方法,Unsafe 最终调用操作系统 API。

AQS(AbstractQueuedSynchronizer) 并发工具抽象类利用了 CAS 和 LockSupport 来实现,ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch 都是基于 AQS 来实现的,通过 AQS 可以简化并发工具的实现,AQS 封装了一个 int 的状态,给子类提供了查询和设置的方法,如下:

        private volatile int state;

        protected final int getState ();
        
        protected final void setState ( int newState );

        protected final boolean compareAndSetState ( int expect, int update );

用于实现锁时 AQS 可以保存锁的当前持有线程,提供的方法如下:

        private transient Thread exclusiveOwnerThread;
        
        protected final void setExclusiveOwnerThread (Thread thread );
        
        protected final Thread getExclusiveOwnerThread ();

AQS 内部维护了一个等待队列,借助 CAS 方法实现了无阻塞算法更新。

ReentrantLock 内部有三个基于 AQS 的内部静态类,如下:

        // 抽象类 
        abstract static class Sync extends AbstractQueuedSynchronizer {}
        
        // 非公平实现
        static final class NonfairSync extends Sync {}
        
        // 公平实现
        static final class FairSync extends Sync {}

ReentrantLock 内部有一个 Sync 成员变量在构造方法中被赋值,构造方法决定了使用 NonfairSync 实例还是 FairSync 实例,默认为 NonfairSync 非公平实例,接着 ReentrantLock 的 lock 其实调用了 Sync 的 lock,unlock 调用了 Sync 的 release(1),所以其实质是基于 AQS 的。

你可能感兴趣的:(ReentrantLock 与 Condition 原理基础解析)