AQS原理
底层使用如下组件
|
|
ReentratLock
多个线程争抢锁
尝试加锁,public boolean tryLock(long timeout, TimeUnit unit) 如果加锁不成功,则等待一段时间不成功则设置当前线程waitstate为SIGNAL状态,并持续重试,若最终超过了等待时间则从队列中移除
ReentrantReadWriteLock读写锁
使用state的高低16位(因为int是32位)来标识读锁(高16位)和写锁(低16位),非0表示已经加过锁了
读锁,可以同时被多个线程同时持有。读请求可以并发起来
写锁,则是互斥的
Condition
可重入锁可以创建Condition,主要有2个方法await与notify/notifyAll。 await等待唤醒,await与notify/notifyAll唤醒对应conditionawait的线程。
Condition.await()原理:将自己加入condition等待队列、释放锁、挂起自己
如果在加锁等待队列里有人阻塞,会有unpark的过程,唤醒加锁等待队列中的队头元素的那个过程
signal唤醒的过程,大概的意思,就是把condition等待队列中的元素,转化为一个加锁等待队列中的元素