美文网首页
ReentrantLock解析

ReentrantLock解析

作者: hvne666 | 来源:发表于2018-10-02 15:27 被阅读63次

ReentrantLock内部持有Sync对象,继承了AQS(AbstractQueuedSynchronizer)抽象类

public class ReentrantLock implements Lock, java.io.Serializable {
    private static final long serialVersionUID = 7373984872572414699L;
    /** Synchronizer providing all implementation mechanics */
    private final Sync sync;

    /**
     * Base of synchronization control for this lock. Subclassed
     * into fair and nonfair versions below. Uses AQS state to
     * represent the number of holds on the lock.
     */
    abstract static class Sync extends AbstractQueuedSynchronizer {
        private static final long serialVersionUID = -5179523762034025860L;

Sync有两个子类,公平和非公平


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

        final void lock() {
            acquire(1);      
        }

        /**
         * Fair version of tryAcquire.  Don't grant access unless
         * recursive call or no waiters or is first.
         */
        protected final boolean tryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {       // 说明锁未被占用
                if (!hasQueuedPredecessors() &&           // 等待队列前面没有等着的
                    compareAndSetState(0, acquires)) {     // cas更新状态 acquires == 1
                    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;
        }
    }

非公平锁的实现基本一致,只是不会判断队列里是否有等着的

static final class NonfairSync extends Sync {
        private static final long serialVersionUID = 7316153563782823691L;

        /**
         * Performs lock.  Try immediate barge, backing up to normal
         * acquire on failure.
         */
        final void lock() {
            if (compareAndSetState(0, 1))            // 直接cas 并保存当前线程
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);                                     // cas失败则走nonfairTryAcquire()
        }

        protected final boolean tryAcquire(int acquires) {
            return nonfairTryAcquire(acquires);
        }
    }

// 和公平锁的唯一区别没有判断队列   !hasQueuedPredecessors() 
final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }

相关文章

  • ReentrantLock

    ReentrantLock的lock和unlock源码解析

  • ReentrantLock解析

    ReentrantLock内部持有Sync对象,继承了AQS(AbstractQueuedSynchronizer...

  • ReentrantLock 解析

    ReentrantLock 有两种实现,公平锁 FairSync 和非公平锁NonfairSync; 用法 则 l...

  • ReentrantLock重入锁和 AQS同步器源码解析

    ReentrantLock重入锁和 AQS同步器源码解析 AQS就是AbstractQueuedSynchroni...

  • ReentrantLock源码解析

    前言 心血来潮想到要做一些源码分析,想想从ReentrantLock类开始挺合适的,就尝试着先写一篇吧,废话不多说...

  • ReentrantLock源码解析

    简介 ReentrantLock是一个可重入的独享锁,是平时常用的一个锁,用法和实现都比较简单,如下: 还有Ree...

  • ReentrantLock源码解析

    看这部分的前提是大家已经看过AbstractQueuedSynchronizer这个类,知道它是个啥了哈,如果不知...

  • ReentrantLock源码解析

    1. 简介 ReentrantLock与synchronized关键字一样是可重入的独占锁,不过Reentrant...

  • ReentrantLock源码解析

    ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表...

  • ReentrantLock源码解析

    ReentrantLock编码示例 ①new ReentrantLock() 无参数构造函数初始化一个非公平锁。关...

网友评论

      本文标题:ReentrantLock解析

      本文链接:https://www.haomeiwen.com/subject/tfqaoftx.html