在上节中解析了AbstractQueuedSynchronizer(AQS)中独占模式对同步状态获取和释放的实现过程。本节将会对共享模式的同步状态获取和释放过程做一个解析。上一节提到了独占模式和共享模式的区别,最主要的区别就是在同一时刻能否有多个线程同时获取到同步状态。
1).共享模式同步状态的获取
这个方法同独占模式获取同步状态的acquire方法一样,同样也是一个模板方法,我们简要回顾一下独占模式下获取同步状态的acquire方法:
//AbstractQueuedSynchronizer#acquirepublic final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) //获取锁(tryAcquire)->构造节点(addWaiter)->加入队列(addWaiter)->自旋获取锁(acquireQueued) selfInterrupt(); //中断当前线程}
网友评论