在上節(jié)中解析了AbstractQueuedSynchronizer(AQS)中獨(dú)占模式對同步狀態(tài)獲取和釋放的實(shí)現(xiàn)過程。本節(jié)將會對共享模式的同步狀態(tài)獲取和釋放過程做一個解析。上一節(jié)提到了獨(dú)占模式和共享模式的區(qū)別,最主要的區(qū)別就是在同一時(shí)刻能否有多個線程同時(shí)獲取到同步狀態(tài)。
1).共享模式同步狀態(tài)的獲取
這個方法同獨(dú)占模式獲取同步狀態(tài)的acquire方法一樣,同樣也是一個模板方法,我們簡要回顧一下獨(dú)占模式下獲取同步狀態(tài)的acquire方法:
//AbstractQueuedSynchronizer#acquirepublic final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) //獲取鎖(tryAcquire)->構(gòu)造節(jié)點(diǎn)(addWaiter)->加入隊(duì)列(addWaiter)->自旋獲取鎖(acquireQueued) selfInterrupt(); //中斷當(dāng)前線程}
網(wǎng)友評論