# 对éçä¸äºè®¤ç¥ æåªäºé ## åä¸è¿ç¨ ### [éå ¥é](https://github.com/crossoverJie/Java-Interview/blob/master/MD/ReentrantLock.md) ä½¿ç¨ `ReentrantLock` è·åéçæ¶åä¼ä¼å¤æå½åçº¿ç¨æ¯å¦ä¸ºè·åéç线ç¨ï¼å¦ææ¯åå°åæ¥çç¶æ +1 ,éæ¾éçæ¶ååå°ç¶æ -1ãåªæå°åæ¥ç¶æç次æ°ç½®ä¸º 0 çæ¶åæä¼æç»éæ¾éã ### 读åé ä½¿ç¨ `ReentrantReadWriteLock` ,åæ¶ç»´æ¤ä¸å¯¹éï¼è¯»éååéãå½å线ç¨è®¿é®æ¶åå ¶ä»ææéé½å°é»å¡ï¼è¯»çº¿ç¨è®¿é®æ¶åä¸ä¼ãéè¿è¯»åéçå离å¯ä»¥å¾å¤§ç¨åº¦çæé«å¹¶åéåååéã ## ä¸åè¿ç¨ åå¸å¼éï¼ ### åºäºæ°æ®åº å¯ä»¥å建ä¸å¼ 表ï¼å°å ¶ä¸çæä¸ªå段设置为`å¯ä¸ç´¢å¼`ï¼å½å¤ä¸ªè¯·æ±è¿æ¥çæ¶ååªææ°å»ºè®°å½æåçè¯·æ±æç®è·åå°éï¼å½ä½¿ç¨å®æ¯å é¤è¿æ¡è®°å½çæ¶åå³éæ¾éã åå¨çé®é¢: - æ°æ®åºåç¹é®é¢ï¼æäºæä¹åï¼ - 䏿¯éå ¥éï¼åä¸è¿ç¨æ æ³å¨éæ¾éä¹å忬¡è·å¾éï¼å ä¸ºæ°æ®åºä¸å·²ç»åå¨äºä¸æ¡è®°å½äºã - 鿝éé»å¡çï¼ä¸æ¦ `insert` 失败åä¼ç«å³è¿åï¼å¹¶ä¸ä¼è¿å ¥é»å¡éååªè½ä¸ä¸æ¬¡å次è·åã - éæ²¡æå¤±ææ¶é´ï¼å¦æé£ä¸ªè¿ç¨è§£é失败é£å°±æ²¡æè¯·æ±å¯ä»¥å次è·åéäºã è§£å³æ¹æ¡: - æ°æ®åºåæ¢ä¸ºä¸»ä»ï¼ä¸åå¨åç¹ã - å¨è¡¨ä¸å å ¥ä¸ä¸ªåæ¥ç¶æåæ®µï¼æ¯æ¬¡è·åéçæ¯å 1 ï¼éæ¾éçæ¶å`-1`ï¼å½ç¶æä¸º 0 çæ¶åå°±å é¤è¿æ¡è®°å½ï¼å³éæ¾éã - éé»å¡çæ åµå¯ä»¥ç¨ `while` å¾ªç¯æ¥å®ç°ï¼å¾ªç¯çæ¶åè®°å½æ¶é´ï¼è¾¾å° X ç§è®°ä¸ºè¶ æ¶ï¼`break`ã - å¯ä»¥å¼å¯ä¸ä¸ªå®æ¶ä»»å¡æ¯é䏿®µæ¶é´æ«ææ¾åºå¤å° X ç§é½æ²¡æè¢«å é¤çè®°å½ï¼ä¸»å¨å é¤è¿æ¡è®°å½ã ### åºäº Redis ä½¿ç¨ `setNX(key) setEX(timeout)` å½ä»¤ï¼åªæå¨è¯¥ `key` ä¸åå¨çæ¶åå建åè¿ä¸ª `key`ï¼å°±ç¸å½äºè·åäºéãç±äºæè¶ æ¶æ¶é´ï¼æä»¥è¿äºè§å®æ¶é´ä¼èªå¨å é¤ï¼è¿æ ·ä¹å¯ä»¥é¿å æ»éã å¯ä»¥åèï¼ [åºäº Redis çåå¸å¼é](http://crossoverjie.top/2018/03/29/distributed-lock/distributed-lock-redis/) ### åºäº ZK