State状态:
- 在ReentrantLock中,state用来表示“锁”的占有情况,包括可重入计数
- 当state的值为0的时候,表示该Lock不被任何线程所占有,意思是当大于0时表示锁被占有
控制线程抢锁和配合 的FIFO队列:
- 这个队列用来存放“等待的线程”,AQS就是“排队管理器”,当多个线程争用同一把锁时,必须有排队机制将那些没能拿到锁的线程串在一起,当锁释放时,锁管理器就会挑选一个合适的线程来占有这个刚刚释放的锁
- AQS会维护一个等待的线程队列,把线程存放到这个队列里
- AQS是一个双向形式的队列
期望协作工具类去实现的获取/释放等重要方法:
这里的获取和释放方法,是利用AQS的协作工具类里最重要的方法,是由协作类自己去实现的,并且含义各不相同
获取方法: 获取操作会依赖state变量,经常会阻塞(比如获取不到锁的时候)
比如ReentrantLock中当state大于0时,表示锁被占用,其他线程需要等待
比如Semaphore中,获取acquire方法,state是1,获取到锁成功的线程 state 减1,当state为0时,就获取不到了
在CountDownLatch里面,获取await方法,作用是”等待,直到倒数结束”,当不等于0就会陷入阻塞,直到state为0时就会被唤醒释放方法: 释放操作不会阻塞
在Semaphore中,释放就是release方法,作用是释放一个许可证
CountDownLatch里面,获取就是countDown方法,作用是“倒数一个数”