State状态

    1. 在ReentrantLock中,state用来表示“锁”的占有情况,包括可重入计数
    2. 当state的值为0的时候,表示该Lock不被任何线程所占有,意思是当大于0时表示锁被占有

    控制线程抢锁和配合 的FIFO队列

    1. 这个队列用来存放“等待的线程”,AQS就是“排队管理器”,当多个线程争用同一把锁时,必须有排队机制将那些没能拿到锁的线程串在一起,当锁释放时,锁管理器就会挑选一个合适的线程来占有这个刚刚释放的锁
    2. AQS会维护一个等待的线程队列,把线程存放到这个队列里
    3. AQS是一个双向形式的队列

    期望协作工具类去实现的获取/释放等重要方法
    这里的获取和释放方法,是利用AQS的协作工具类里最重要的方法,是由协作类自己去实现的,并且含义各不相同

    1. 获取方法: 获取操作会依赖state变量,经常会阻塞(比如获取不到锁的时候)

      比如ReentrantLock中当state大于0时,表示锁被占用,其他线程需要等待
      比如Semaphore中,获取acquire方法,state是1,获取到锁成功的线程 state 减1,当state为0时,就获取不到了
      在CountDownLatch里面,获取await方法,作用是”等待,直到倒数结束”,当不等于0就会陷入阻塞,直到state为0时就会被唤醒

    2. 释放方法: 释放操作不会阻塞

      在Semaphore中,释放就是release方法,作用是释放一个许可证
      CountDownLatch里面,获取就是countDown方法,作用是“倒数一个数”