1、AQS
AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。
AQS继承AbstractOwnableSynchronizer,AbstractOwnableSynchronizer设置当前线程的独占拥有者。
AQS state字段是volatile类型的int值,作为lock的记录值,在ReentrantLock中如果判断当前线程持有锁,则返回获取锁成功,并且state数值加1
ReentrantLock是可重入锁,支持公平锁和非公平锁,底层由AQS实现,两者是怎么关联起来的呢?定义Sync类继承AQS实现抽象类。在ReentrantLock中定义公平锁和非公平锁都是继承Sync类。
独占锁通过CAS设置state状态成功,获取独占锁;若设置失败,进入Acquire方法进行后续处理。如果获取锁失败会进行排队等候,排队等候就会用到队列结构,队列结构实现是在AQS中实现,类似自旋锁队列结构,是双向链表,通过定义Node节点保存排队的线程以及队列的前后节点。在acquire时候会尝试获取锁,如果获取失败就会通过addWaiter生成node节点,并且设置为tail节点,判断node节点是否在head节点之后,如果是那么就自旋等待获取锁;如果不是,就将当前节点加入到等待队列中,并且调用LockSupport.park挂起当前线程,阻塞调用栈,返回当前线程的中断状态。
如何解锁?
unlock -> sync.release(1);
release释放锁,减少可重入次数,如果state=0了,那就释放锁,同事将等待队列从后往前找到待激活的线程,解挂激活线程来获取锁结构。
CountDownLatch和CyclicBarrier能够实现线程之间的等待,CountDownLatch是等线程都达到某种状态,CyclicBarrier是用于一组线程都等待到某个状态,然后这一组线程同时执行,CyclicBarrier是可以重用的,这组线程用完了,下组还能用。
Semaphore和锁有点类似,用于控制对某组资源的访问权限。
网友评论