ReentrantReadWriteLock笔记(二) -- Sync源码分析

ReentrantReadWriteLock中的内部类Sync很重要,因为主要的实现逻辑就在它里面,看一下它比较重要的成员

abstract static class Sync extends AbstractQueuedSynchronizer {
    ...省略
    //共享资源数的位数
    static final int SHARED_SHIFT   = 16;
    //获取共享资源的单位数
    static final int SHARED_UNIT    = (1 << SHARED_SHIFT);
    static final int MAX_COUNT      = (1 << SHARED_SHIFT) - 1;
    static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1;
    //上面想表达的是,sync的state值高16位是保存共享资源数,低16位是保存排它资源数

    //获取共享资源数,就是c的高16位数
    static int sharedCount(int c)    { return c >>> SHARED_SHIFT; }
       //获取排它资源数,其实就是c的低16位
    static int exclusiveCount(int c) { return c & EXCLUSIVE_MASK; }
    //一个内部类,用于记录每个线程持有的共享资源数
    static final class HoldCounter {
         int count = 0;
        //每个线程的唯一ID
          final long tid = getThreadId(Thread.currentThread());
      }
    private transient HoldCounter cachedHoldCounter;
    //一个内部类,保存每个线程的HoldCounter对象(需要了解ThreadLocal相关知识)
    static final class ThreadLocalHoldCounter
           extends ThreadLocal<HoldCounter> {
           public HoldCounter initialValue() {
               return new HoldCounter();
           }
       }
    //这个变量可以获取每个线程的HoldCounter对象
    private transient ThreadLocalHoldCounter readHolds;
}

看看构造方法

    Sync() {
        readHolds = new ThreadLocalHoldCounter();
        setState(getState()); // ensures visibility of readHolds
    }

Sync有两个子类:FairSync、NonfairSync,所以ReentrantReadWriteLock支持公平、非公平锁。

下篇文章分析ReentrantReadWriteLock的writeLock的公平、非公平锁实现

猜你喜欢

转载自blog.csdn.net/seasonLai/article/details/82559111