# AQS > è¿ä¸ªå ççï¼è¿ä¸ªå 容æç¹å¤ï¼å¾ æè¿å¨ç»æä¹åæ¥åã é¢è¯å®ï¼AQSæ¯ä»ä¹ï¼ ## åç æï¼AbstractQueuedSynchronizeræ½è±¡åæ¥éåã说ç½äºï¼å°±æ¯ä¸ªFIFOååéåãå ¶å é¨éè¿èç¹headåtailè®°å½å¯¹é¦åéå°¾å ç´ ã **state**ï¼å¨AQSä¸ç»´æäºä¸ä¸ªåä¸çç¶æä¿¡æ¯stateï¼å¯ä»¥éè¿**getState**ã**setState**ã**compareAndSetState**彿°ä¿®æ¹å ¶å¼ã - **ReentrantLock**ï¼stateå¯ä»¥ç¨æ¥è¡¨ç¤ºå½å线ç¨è·åéçå¯éå ¥æ¬¡æ°ã - **ReentrantReadWriteLock**ï¼stateçé«16ä½è¡¨ç¤ºè¯»ç¶æï¼ä¹å°±æ¯è·å该读éçæ¬¡æ°ï¼ä½16ä½è¡¨ç¤ºè·åå°åéç线ç¨çå¯éå ¥æ¬¡æ°ã - **semaphore**ï¼stateç¨æ¥è¡¨ç¤ºå½åå¯ç¨ä¿¡å·ç个æ°ã - **CountDownlatch**ï¼stateç¨æ¥è¡¨ç¤ºè®¡æ°å¨å½åçå¼ã 对äºAQSæ¥è®²ï¼çº¿ç¨åæ¥çå ³é®æ¯å¯¹ç¶æå¼**state**è¿è¡æä½ã ## æ¹æ³ å¨ç¬å æ¹å¼ä¸è·ååéæ¾èµæºä½¿ç¨çæ¹æ³ï¼ ```java void acquire(int arg); void acquireInterruptibly(int arg); boolean release(int arg); ``` å¨å ±äº«æ¹å¼è·ååéæ¾èµæºä½¿ç¨çæ¹æ³ï¼ ```java void acquireShared(int arg); void acquireSharedInterruptibly(int arg); boolean releaseShared(int arg); ``` 使ç¨ç¬å æ¹å¼è·åçèµæºæ¯ä¸**å ·ä½çº¿ç¨ç»å®**çï¼å°±æ¯è¯´å¦æä¸ä¸ªçº¿ç¨è·åå°äºèµæºï¼å°±ä¼æ è®°æ¯è¿ä¸ªçº¿ç¨è·åå°äºï¼å ¶ä»çº¿ç¨åå°è¯æä½stateè·åèµæºæ¶ä¼**åç°å½åè¯¥èµæºä¸æ¯èªå·±ææç**ï¼å°±ä¼å¨**è·å失败å被é»å¡**ãï¼æ¯å¦ReentrantLockï¼ å¯¹åºçå ±äº«æ¹å¼çèµæºä¸å ·ä½çº¿ç¨æ¯ä¸ç¸å ³çï¼å½å¤ä¸ªçº¿ç¨å»è¯·æ±èµæºæ¶éè¿CASæ¹å¼ç«äºè·åèµæºï¼å½ä¸ä¸ªçº¿ç¨è·åå°äºèµæºåï¼å¦å¤ä¸ä¸ªçº¿ç¨å次å»è·åæ¶å¦æå½åèµæºè¿è½æ»¡è¶³å®çèµæºï¼åå½å线ç¨åªéè¦ä½¿ç¨CASæ¹å¼è¿è¡è·åå³å¯ãï¼æ¯å¦semaphoreï¼ çä¸ä¸**acquire**æ¹æ³ï¼ ```java // tryAcquire å ·ä½çåç±»å»å®ç°ï¼å¹¶ç»´æ¤stateçç¶æ public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) // å¦æå¤±è´¥æ è®°ç¶æï¼å ¥é selfInterrupt(); } ``` çä¸ä¸**release**æ¹æ³ï¼ ```java // tryRelease å ·ä½çåç±»æ¯å®ç°ï¼å¹¶è®¾ç½®stateçç¶æ public final boolean release(int arg) { if (tryRelease(arg)) { Node h = head; if (h != null && h.waitStatus != 0) unparkSuccessor(h); // è°ç¨unparkå¤ééåç线ç¨ï¼å¹¶è°ç¨tryAcquireå°è¯ï¼çæ¯å¦éè¦ï¼å¦æä¸éè¦ï¼ç»§ç»æèµ· return true; } return false; } ``` **acquireSharedåreleaseShared**åä¸é¢çæ¹æ³çææ³å·®ä¸å¤