1.1 同步队列:队列中存放排队等待锁的线程,每个线程放入队列时会被包装为Node类,如下图。

1.2 抢锁:调用lock方法,如果抢锁成功(CAS成功,或者是重入——state计数加1),那么initialTryLock方法返回true,如下图。如果失败,再重新acquire尝试一次。尝试之后还是失败,那么将当前线程放入AQS等待队列中,并通过LockSupport的park方法挂起当前线程。


抢锁时,公平锁FairSync和非公平锁NonFairSync的区别就是公平锁FairSync在抢锁时会判断当前等待队列中是否有线程在等待,如下图所示。

1.3 释放锁:因为存在重入,所以state减到0,才说明锁完全释放。



本文详细介绍了Java并发编程中的AbstractQueuedSynchronizer(AQS)机制,包括同步队列、公平锁与非公平锁的工作原理以及锁的获取与释放过程。AQS通过内部的Node类管理等待线程,并使用CAS操作保证线程安全。公平锁在尝试获取锁时会考虑队列中是否有等待的线程,而非公平锁则不保证这一公平性。
226

被折叠的 条评论
为什么被折叠?



