 ### synchronizedå ³é®åæä¸»è¦çä¸ç§ä½¿ç¨æ¹å¼çæ»ç» - **修饰å®ä¾æ¹æ³ï¼ä½ç¨äºå½å对象å®ä¾å éï¼è¿å ¥åæ¥ä»£ç åè¦è·å¾å½å对象å®ä¾çé** - **ä¿®é¥°éææ¹æ³ï¼ä½ç¨äºå½å类对象å éï¼è¿å ¥åæ¥ä»£ç åè¦è·å¾å½å类对象çé** ãä¹å°±æ¯ç»å½åç±»å éï¼ä¼ä½ç¨äºç±»çææå¯¹è±¡å®ä¾ï¼å ä¸ºéææåä¸å±äºä»»ä½ä¸ä¸ªå®ä¾å¯¹è±¡ï¼æ¯ç±»æåï¼ static 表æè¿æ¯è¯¥ç±»çä¸ä¸ªéæèµæºï¼ä¸ç®¡newäºå¤å°ä¸ªå¯¹è±¡ï¼åªæä¸ä»½ï¼æä»¥å¯¹è¯¥ç±»çææå¯¹è±¡é½å äºéï¼ãæä»¥å¦æä¸ä¸ªçº¿ç¨Aè°ç¨ä¸ä¸ªå®ä¾å¯¹è±¡çééæ synchronized æ¹æ³ï¼è线ç¨Béè¦è°ç¨è¿ä¸ªå®ä¾å¯¹è±¡æå±ç±»çéæ synchronized æ¹æ³ï¼æ¯å 许çï¼ä¸ä¼åçäºæ¥ç°è±¡ï¼**å 为访é®éæ synchronized æ¹æ³å ç¨ç鿝å½åç±»çéï¼è访é®ééæ synchronized æ¹æ³å ç¨ç鿝å½åå®ä¾å¯¹è±¡é**ã - **修饰代ç åï¼æå®å é对象ï¼å¯¹ç»å®å¯¹è±¡å éï¼è¿å ¥åæ¥ä»£ç ååè¦è·å¾ç»å®å¯¹è±¡çéã** å synchronized æ¹æ³ä¸æ ·ï¼synchronized(this)代ç å乿¯éå®å½å对象çãsynchronized å ³é®åå å° static éææ¹æ³å synchronized(class)代ç åä¸é½æ¯æ¯ç» Class ç±»ä¸éãè¿éåæä¸ä¸ï¼synchronizedå ³é®åå å°é static éææ¹æ³ä¸æ¯ç»å¯¹è±¡å®ä¾ä¸éãå¦å¤éè¦æ³¨æçæ¯ï¼å°½éä¸è¦ä½¿ç¨ synchronized(String a) å 为JVMä¸ï¼åç¬¦ä¸²å¸¸éæ± å ·æç¼å²åè½ï¼ ä¸é¢æå·²ä¸ä¸ªå¸¸è§çé¢è¯é¢ä¸ºä¾è®²è§£ä¸ä¸ synchronized å ³é®åçå ·ä½ä½¿ç¨ã é¢è¯ä¸é¢è¯å®ç»å¸¸ä¼è¯´ï¼âå便¨¡å¼äºè§£åï¼æ¥ç»ææåä¸ä¸ï¼ç»æè§£éä¸ä¸å鿣éªéæ¹å¼å®ç°å便¨¡å¼çåçåï¼â **åéæ ¡éªéå®ç°å¯¹è±¡åä¾ï¼çº¿ç¨å®å ¨ï¼** ```java public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() { } public static Singleton getUniqueInstance() { //å å¤æå¯¹è±¡æ¯å¦å·²ç»å®ä¾è¿ï¼æ²¡æå®ä¾åè¿æè¿å ¥å é代ç if (uniqueInstance == null) { //类对象å é synchronized (Singleton.class) { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } } ``` å¦å¤ï¼éè¦æ³¨æ uniqueInstance éç¨ volatile å ³é®åä¿®é¥°ä¹æ¯å¾æå¿ è¦ã uniqueInstance éç¨ volatile å ³é®åä¿®é¥°ä¹æ¯å¾æå¿ è¦çï¼ uniqueInstance = new Singleton(); è¿æ®µä»£ç å ¶å®æ¯åä¸ºä¸æ¥æ§è¡ï¼ 1. 为 uniqueInstance åé å åç©ºé´ 2. åå§å uniqueInstance 3. å° uniqueInstance æååé çå åå°å 使¯ç±äº JVM å ·ææä»¤éæçç¹æ§ï¼æ§è¡é¡ºåºæå¯è½åæ 1->3->2ãæä»¤éæå¨å线ç¨ç¯å¢ä¸ä¸ä¼åºç°é®é¢ï¼ä½æ¯å¨å¤çº¿ç¨ç¯å¢ä¸ä¼å¯¼è´ä¸ä¸ªçº¿ç¨è·å¾è¿æ²¡æåå§åçå®ä¾ãä¾å¦ï¼çº¿ç¨ T1 æ§è¡äº 1 å 3ï¼æ¤æ¶ T2 è°ç¨ getUniqueInstance() ååç° uniqueInstance ä¸ä¸ºç©ºï¼å æ¤è¿å uniqueInstanceï¼ä½æ¤æ¶ uniqueInstance è¿æªè¢«åå§åã ä½¿ç¨ volatile å¯ä»¥ç¦æ¢ JVM çæä»¤éæï¼ä¿è¯å¨å¤çº¿ç¨ç¯å¢ä¸ä¹è½æ£å¸¸è¿è¡ã ###synchronized å ³é®ååºå±åçæ»ç» **synchronized å ³é®ååºå±åçå±äº JVM å±é¢ã** **â synchronized 忥è¯å¥åçæ åµ** ```java public class SynchronizedDemo { public void method() { synchronized (this) { System.out.println("synchronized 代ç å"); } } } ``` éè¿ JDK èªå¸¦ç javap å½ä»¤æ¥ç SynchronizedDemo ç±»çç¸å ³åèç ä¿¡æ¯ï¼é¦å 忢å°ç±»ç对åºç®å½æ§è¡ `javac SynchronizedDemo.java` å½ä»¤çæç¼è¯åç .class æä»¶ï¼ç¶åæ§è¡`javap -c -s -v -l SynchronizedDemo.class`ã  ä»ä¸é¢æä»¬å¯ä»¥çåºï¼ **synchronized 忥è¯å¥åçå®ç°ä½¿ç¨çæ¯ monitorenter å monitorexit æä»¤ï¼å ¶ä¸ monitorenter æä»¤æå忥代ç åçå¼å§ä½ç½®ï¼monitorexit æä»¤åææåæ¥ä»£ç åçç»æä½ç½®ã** 彿§è¡ monitorenter æä»¤æ¶ï¼çº¿ç¨è¯å¾è·åéä¹å°±æ¯è·å monitor(monitor对象åå¨äºæ¯ä¸ªJava对象ç对象头ä¸ï¼synchronized é便æ¯éè¿è¿ç§æ¹å¼è·åéçï¼ä¹æ¯ä¸ºä»ä¹Javaä¸ä»»æå¯¹è±¡å¯ä»¥ä½ä¸ºéçåå ) çæææ.å½è®¡æ°å¨ä¸º0åå¯ä»¥æåè·åï¼è·ååå°é计æ°å¨è®¾ä¸º1ä¹å°±æ¯å 1ãç¸åºç卿§è¡ monitorexit æä»¤åï¼å°é计æ°å¨è®¾ä¸º0ï¼è¡¨æéè¢«éæ¾ã妿è·å对象é失败ï¼é£å½å线ç¨å°±è¦é»å¡çå¾ ï¼ç´å°é被å¦å¤ä¸ä¸ªçº¿ç¨éæ¾ä¸ºæ¢ã **â¡ synchronized ä¿®é¥°æ¹æ³ççæ åµ** ```java public class SynchronizedDemo2 { public synchronized void method() { System.out.println("synchronized æ¹æ³"); } } ```  synchronized ä¿®é¥°çæ¹æ³å¹¶æ²¡æ monitorenter æä»¤å monitorexit æä»¤ï¼åå¾ä»£ä¹çç¡®å®æ¯ ACC_SYNCHRONIZED æ è¯ï¼è¯¥æ è¯ææäºè¯¥æ¹æ³æ¯ä¸ä¸ªåæ¥æ¹æ³ï¼JVM éè¿è¯¥ ACC_SYNCHRONIZED è®¿é®æ å¿æ¥è¾¨å«ä¸ä¸ªæ¹æ³æ¯å¦å£°æä¸ºåæ¥æ¹æ³ï¼ä»èæ§è¡ç¸åºç忥è°ç¨ã å¨ Java æ©æçæ¬ä¸ï¼synchronized å±äºéé级éï¼æçä½ä¸ï¼å 为çè§å¨éï¼monitorï¼æ¯ä¾èµäºåºå±çæä½ç³»ç»ç Mutex Lock æ¥å®ç°çï¼Java ççº¿ç¨æ¯æ å°å°æä½ç³»ç»çåç线ç¨ä¹ä¸çãå¦æè¦æèµ·æè å¤éä¸ä¸ªçº¿ç¨ï¼é½éè¦æä½ç³»ç»å¸®å¿å®æï¼èæä½ç³»ç»å®ç°çº¿ç¨ä¹é´ç忢æ¶éè¦ä»ç¨æ·æè½¬æ¢å°å æ ¸æï¼è¿ä¸ªç¶æä¹é´ç转æ¢éè¦ç¸å¯¹æ¯è¾é¿çæ¶é´ï¼æ¶é´ææ¬ç¸å¯¹è¾é«ï¼è¿ä¹æ¯ä¸ºä»ä¹æ©æç synchronized æçä½çåå ãåºå¹¸çæ¯å¨ Java 6 ä¹å Java 宿¹å¯¹ä» JVM å±é¢å¯¹synchronized è¾å¤§ä¼åï¼æä»¥ç°å¨ç synchronized éæçä¹ä¼åå¾å¾ä¸éäºãJDK1.6对éçå®ç°å¼å ¥äºå¤§éçä¼åï¼å¦èªæéãéåºæ§èªæéãéæ¶é¤ãéç²åãååéãè½»é级éçææ¯æ¥åå°éæä½çå¼éã ### JDK1.6 ä¹åçåºå±ä¼å JDK1.6 对éçå®ç°å¼å ¥äºå¤§éçä¼åï¼å¦ååéãè½»é级éãèªæéãéåºæ§èªæéãéæ¶é¤ãéç²åçææ¯æ¥åå°éæä½çå¼éã é主è¦åå¨åä¸ç¶æï¼ä¾æ¬¡æ¯ï¼æ éç¶æãååéç¶æãè½»é级éç¶æãéé级éç¶æï¼ä»ä»¬ä¼éçç«äºçæ¿çè鿏åçº§ãæ³¨æéå¯ä»¥å级ä¸å¯é级ï¼è¿ç§çç¥æ¯ä¸ºäºæé«è·å¾éåéæ¾éçæçã **â ååé** **å¼å ¥ååéçç®çåå¼å ¥è½»é级éçç®çå¾åï¼ä»ä»¬é½æ¯ä¸ºäºæ²¡æå¤çº¿ç¨ç«äºçåæä¸ï¼åå°ä¼ ç»çéé级éä½¿ç¨æä½ç³»ç»äºæ¥é产ççæ§è½æ¶èã使¯ä¸åæ¯ï¼è½»é级é卿 ç«äºçæ åµä¸ä½¿ç¨ CAS æä½å»ä»£æ¿ä½¿ç¨äºæ¥éãèååé卿 ç«äºçæ åµä¸ä¼ææ´ä¸ªåæ¥é½æ¶é¤æ**ã ååéçâåâå°±æ¯åå¿çåï¼å®çæææ¯ä¼ååäºç¬¬ä¸ä¸ªè·å¾å®ç线ç¨ï¼å¦æå¨æ¥ä¸æ¥çæ§è¡ä¸ï¼è¯¥é没æè¢«å ¶ä»çº¿ç¨è·åï¼é£ä¹ææååéç线ç¨å°±ä¸éè¦è¿è¡åæ¥ï¼å ³äºååéçåçå¯ä»¥æ¥çãæ·±å ¥çè§£Javaèææºï¼JVMé«çº§ç¹æ§ä¸æä½³å®è·µã第äºçç13ç« ç¬¬ä¸èéä¼åã 使¯å¯¹äºéç«äºæ¯è¾æ¿ççåºåï¼ååé就失æäºï¼å ä¸ºè¿æ ·åºåææå¯è½æ¯æ¬¡ç³è¯·éç线ç¨é½æ¯ä¸ç¸åçï¼å æ¤è¿ç§åºåä¸ä¸åºè¯¥ä½¿ç¨ååéï¼å¦åä¼å¾ä¸å¿å¤±ï¼éè¦æ³¨æçæ¯ï¼ååé失败åï¼å¹¶ä¸ä¼ç«å³è¨è为éé级éï¼èæ¯å å级为轻é级éã **â¡ è½»é级é** åè¥ååé失败ï¼èææºå¹¶ä¸ä¼ç«å³å级为éé级éï¼å®è¿ä¼å°è¯ä½¿ç¨ä¸ç§ç§°ä¸ºè½»é级éçä¼åææ®µ(1.6ä¹åå å ¥ç)ã**è½»é级é䏿¯ä¸ºäºä»£æ¿éé级éï¼å®çæ¬ææ¯å¨æ²¡æå¤çº¿ç¨ç«äºçåæä¸ï¼åå°ä¼ ç»çéé级éä½¿ç¨æä½ç³»ç»äºæ¥é产ççæ§è½æ¶èï¼å 为使ç¨è½»éçº§éæ¶ï¼ä¸éè¦ç³è¯·äºæ¥éãå¦å¤ï¼è½»é级éçå éåè§£éé½ç¨å°äºCASæä½ã** å ³äºè½»é级éçå éåè§£éçåçå¯ä»¥æ¥çãæ·±å ¥çè§£Javaèææºï¼JVMé«çº§ç¹æ§ä¸æä½³å®è·µã第äºçç13ç« ç¬¬ä¸èéä¼åã **è½»é级éè½å¤æåç¨åºåæ¥æ§è½ç便®æ¯â对äºç»å¤§é¨åéï¼å¨æ´ä¸ªåæ¥å¨æå 齿¯ä¸åå¨ç«äºçâï¼è¿æ¯ä¸ä¸ªç»éªæ°æ®ãå¦ææ²¡æç«äºï¼è½»é级éä½¿ç¨ CAS æä½é¿å äºä½¿ç¨äºæ¥æä½çå¼éãä½å¦æåå¨éç«äºï¼é¤äºäºæ¥éå¼éå¤ï¼è¿ä¼é¢å¤åçCASæä½ï¼å æ¤å¨æéç«äºçæ åµä¸ï¼è½»éçº§éæ¯ä¼ ç»çééçº§éæ´æ ¢ï¼å¦æéç«äºæ¿çï¼é£ä¹è½»é级å°å¾å¿«è¨è为éé级éï¼** **â¢ èªæéåèªéåºèªæ** è½»é级é失败åï¼èææºä¸ºäºé¿å 线ç¨çå®å°å¨æä½ç³»ç»å±é¢æèµ·ï¼è¿ä¼è¿è¡ä¸é¡¹ç§°ä¸ºèªæéçä¼åææ®µã äºæ¥åæ¥å¯¹æ§è½æå¤§çå½±åå°±æ¯é»å¡çå®ç°ï¼å 为æèµ·çº¿ç¨/æ¢å¤çº¿ç¨çæä½é½éè¦è½¬å ¥å æ ¸æä¸å®æï¼ç¨æ·æè½¬æ¢å°å æ ¸æä¼èè´¹æ¶é´ï¼ã **ä¸è¬çº¿ç¨ææéçæ¶é´é½ä¸æ¯å¤ªé¿ï¼æä»¥ä» ä» ä¸ºäºè¿ä¸ç¹æ¶é´å»æèµ·çº¿ç¨/æ¢å¤çº¿ç¨æ¯å¾ä¸å¿å¤±çã** æä»¥ï¼èææºçå¼åå¢éå°±è¿æ ·å»èèï¼âæä»¬è½ä¸è½è®©å颿¥ç请æ±è·åéç线ç¨çå¾ ä¸ä¼èä¸è¢«æèµ·å¢ï¼ççææéççº¿ç¨æ¯å¦å¾å¿«å°±ä¼éæ¾éâã**为äºè®©ä¸ä¸ªçº¿ç¨çå¾ ï¼æä»¬åªéè¦è®©çº¿ç¨æ§è¡ä¸ä¸ªå¿å¾ªç¯ï¼èªæï¼ï¼è¿é¡¹ææ¯å°±å«åèªæ**ã ç¾åº¦ç¾ç§å¯¹èªæéçè§£éï¼ > ä½è°èªæéï¼å®æ¯ä¸ºå®ç°ä¿æ¤å ±äº«èµæºèæåºä¸ç§éæºå¶ãå ¶å®ï¼èªæéä¸äºæ¥éæ¯è¾ç±»ä¼¼ï¼å®ä»¬é½æ¯ä¸ºäºè§£å³å¯¹æé¡¹èµæºçäºæ¥ä½¿ç¨ãæ 论æ¯äºæ¥éï¼è¿æ¯èªæéï¼å¨ä»»ä½æ¶å»ï¼æå¤åªè½æä¸ä¸ªä¿æè ï¼ä¹å°±è¯´ï¼å¨ä»»ä½æ¶å»æå¤åªè½æä¸ä¸ªæ§è¡åå è·å¾éã使¯ä¸¤è å¨è°åº¦æºå¶ä¸ç¥æä¸åã对äºäºæ¥éï¼å¦æèµæºå·²ç»è¢«å ç¨ï¼èµæºç³è¯·è åªè½è¿å ¥ç¡ç ç¶æã使¯èªæéä¸ä¼å¼èµ·è°ç¨è ç¡ç ï¼å¦æèªæéå·²ç»è¢«å«çæ§è¡åå ä¿æï¼è°ç¨è å°±ä¸ç´å¾ªç¯å¨é£éçæ¯å¦è¯¥èªæéçä¿æè å·²ç»éæ¾äºéï¼"èªæ"ä¸è¯å°±æ¯å æ¤èå¾åã èªæéå¨ JDK1.6 ä¹åå ¶å®å°±å·²ç»å¼å ¥äºï¼ä¸è¿æ¯é»è®¤å ³éçï¼éè¦éè¿`--XX:+UseSpinning`åæ°æ¥å¼å¯ãJDK1.6å1.6ä¹åï¼å°±æ¹ä¸ºé»è®¤å¼å¯çäºãéè¦æ³¨æçæ¯ï¼èªæçå¾ ä¸è½å®å ¨æ¿ä»£é»å¡ï¼å 为å®è¿æ¯è¦å ç¨å¤ç卿¶é´ã妿é被å ç¨çæ¶é´çï¼é£ä¹ææå½ç¶å°±å¾å¥½äºï¼åä¹ï¼ç¸åï¼èªæçå¾ çæ¶é´å¿ é¡»è¦æé度ãå¦æèªæè¶ è¿äºé宿¬¡æ°ä»»ç¶æ²¡æè·å¾éï¼å°±åºè¯¥æèµ·çº¿ç¨ã**èªææ¬¡æ°çé»è®¤å¼æ¯10次ï¼ç¨æ·å¯ä»¥ä¿®æ¹`--XX:PreBlockSpin`æ¥æ´æ¹**ã å¦å¤,**å¨ JDK1.6 ä¸å¼å ¥äºèªéåºçèªæéãèªéåºçèªæé带æ¥çæ¹è¿å°±æ¯ï¼èªæçæ¶é´ä¸å¨åºå®äºï¼èæ¯åå䏿¬¡åä¸ä¸ªéä¸çèªææ¶é´ä»¥åéçæ¥æè çç¶ææ¥å³å®ï¼èææºåå¾è¶æ¥è¶âèªæâäº**ã **â£ éæ¶é¤** éæ¶é¤ç解起æ¥å¾ç®åï¼å®æçå°±æ¯èææºå³ä½¿ç¼è¯å¨å¨è¿è¡æ¶ï¼å¦ææ£æµå°é£äºå ±äº«æ°æ®ä¸å¯è½åå¨ç«äºï¼é£ä¹å°±æ§è¡éæ¶é¤ãéæ¶é¤å¯ä»¥èçæ¯«æ æä¹ç请æ±éçæ¶é´ã **⤠éç²å** ååä¸ï¼æä»¬å¨ç¼å代ç çæ¶åï¼æ»æ¯æ¨èå°åæ¥åçä½ç¨èå´éå¶å¾å°½éå°ï¼ââç´å¨å ±äº«æ°æ®çå®é ä½ç¨åæè¿è¡åæ¥ï¼è¿æ ·æ¯ä¸ºäºä½¿å¾éè¦åæ¥çæä½æ°éå°½å¯è½åå°ï¼å¦æåå¨éç«äºï¼é£çå¾ çº¿ç¨ä¹è½å°½å¿«æ¿å°éã 大é¨åæ åµä¸ï¼ä¸é¢çåå齿¯æ²¡æé®é¢çï¼ä½æ¯å¦æä¸ç³»åçè¿ç»æä½é½å¯¹åä¸ä¸ªå¯¹è±¡åå¤å éåè§£éï¼é£ä¹ä¼å¸¦æ¥å¾å¤ä¸å¿ è¦çæ§è½æ¶èã ### Synchronized å ReenTrantLock çå¯¹æ¯ **â 两è 齿¯å¯éå ¥é** 两è 齿¯å¯éå ¥éãâå¯éå ¥éâæ¦å¿µæ¯ï¼èªå·±å¯ä»¥å次è·åèªå·±çå é¨éãæ¯å¦ä¸ä¸ªçº¿ç¨è·å¾äºæä¸ªå¯¹è±¡çéï¼æ¤æ¶è¿ä¸ªå¯¹è±¡éè¿æ²¡æéæ¾ï¼å½å ¶å次æ³è¦è·åè¿ä¸ªå¯¹è±¡çéçæ¶åè¿æ¯å¯ä»¥è·åçï¼å¦æä¸å¯ééå ¥çè¯ï¼å°±ä¼é ææ»éãåä¸ä¸ªçº¿ç¨æ¯æ¬¡è·åéï¼éç计æ°å¨é½èªå¢1ï¼æä»¥è¦çå°éç计æ°å¨ä¸é为0æ¶æè½éæ¾éã **â¡ synchronized ä¾èµäº JVM è ReenTrantLock ä¾èµäº API** synchronized æ¯ä¾èµäº JVM å®ç°çï¼å颿们ä¹è®²å°äº èææºå¢éå¨ JDK1.6 为 synchronized å ³é®åè¿è¡äºå¾å¤ä¼åï¼ä½æ¯è¿äºä¼å齿¯å¨èææºå±é¢å®ç°çï¼å¹¶æ²¡æç´æ¥æ´é²ç»æä»¬ãReenTrantLock æ¯ JDK å±é¢å®ç°çï¼ä¹å°±æ¯ API å±é¢ï¼éè¦ lock() å unlock æ¹æ³é å try/finally è¯å¥åæ¥å®æï¼ï¼æä»¥æä»¬å¯ä»¥éè¿æ¥çå®çæºä»£ç ï¼æ¥ç宿¯å¦ä½å®ç°çã **⢠ReenTrantLock æ¯ synchronized å¢å äºä¸äºé«çº§åè½** ç¸æ¯synchronizedï¼ReenTrantLockå¢å äºä¸äºé«çº§åè½ãä¸»è¦æ¥è¯´ä¸»è¦æä¸ç¹ï¼**â çå¾ å¯ä¸æï¼â¡å¯å®ç°å ¬å¹³éï¼â¢å¯å®ç°éæ©æ§éç¥ï¼éå¯ä»¥ç»å®å¤ä¸ªæ¡ä»¶ï¼** - **ReenTrantLockæä¾äºä¸ç§è½å¤ä¸æçå¾ éç线ç¨çæºå¶**ï¼éè¿lock.lockInterruptibly()æ¥å®ç°è¿ä¸ªæºå¶ãä¹å°±æ¯è¯´æ£å¨çå¾ ç线ç¨å¯ä»¥éæ©æ¾å¼çå¾ ï¼æ¹ä¸ºå¤çå ¶ä»äºæ ã - **ReenTrantLockå¯ä»¥æå®æ¯å ¬å¹³éè¿æ¯éå ¬å¹³éãèsynchronizedåªè½æ¯éå ¬å¹³éãæè°çå ¬å¹³éå°±æ¯å çå¾ ç线ç¨å è·å¾éã** ReenTrantLocké»è®¤æ 嵿¯éå ¬å¹³çï¼å¯ä»¥éè¿ ReenTrantLockç±»ç`ReentrantLock(boolean fair)`æé æ¹æ³æ¥å¶å®æ¯å¦æ¯å ¬å¹³çã - synchronizedå ³é®åä¸wait()ånotify/notifyAll()æ¹æ³ç¸ç»åå¯ä»¥å®ç°çå¾ /éç¥æºå¶ï¼ReentrantLockç±»å½ç¶ä¹å¯ä»¥å®ç°ï¼ä½æ¯éè¦åå©äºConditionæ¥å£ä¸newCondition() æ¹æ³ãConditionæ¯JDK1.5ä¹åææçï¼å®å ·æå¾å¥½ççµæ´»æ§ï¼æ¯å¦å¯ä»¥å®ç°å¤è·¯éç¥åè½ä¹å°±æ¯å¨ä¸ä¸ªLock对象ä¸å¯ä»¥å建å¤ä¸ªConditionå®ä¾ï¼å³å¯¹è±¡çè§å¨ï¼ï¼**线ç¨å¯¹è±¡å¯ä»¥æ³¨å卿å®çConditionä¸ï¼ä»èå¯ä»¥æéæ©æ§çè¿è¡çº¿ç¨éç¥ï¼å¨è°åº¦çº¿ç¨ä¸æ´å çµæ´»ã å¨ä½¿ç¨notify/notifyAll()æ¹æ³è¿è¡éç¥æ¶ï¼è¢«éç¥ççº¿ç¨æ¯ç± JVM éæ©çï¼ç¨ReentrantLockç±»ç»åConditionå®ä¾å¯ä»¥å®ç°âéæ©æ§éç¥â** ï¼è¿ä¸ªåè½é常éè¦ï¼è䏿¯Conditionæ¥å£é»è®¤æä¾çãèsynchronizedå ³é®åå°±ç¸å½äºæ´ä¸ªLock对象ä¸åªæä¸ä¸ªConditionå®ä¾ï¼ææç线ç¨é½æ³¨åå¨å®ä¸ä¸ªèº«ä¸ã妿æ§è¡notifyAll()æ¹æ³çè¯å°±ä¼éç¥ææå¤äºçå¾ ç¶æç线ç¨è¿æ ·ä¼é æå¾å¤§çæçé®é¢ï¼èConditionå®ä¾çsignalAll()æ¹æ³ åªä¼å¤é注åå¨è¯¥Conditionå®ä¾ä¸çææçå¾ çº¿ç¨ã å¦æä½ æ³ä½¿ç¨ä¸è¿°åè½ï¼é£ä¹éæ©ReenTrantLockæ¯ä¸ä¸ªä¸éçéæ©ã **⣠æ§è½å·²ä¸æ¯éæ©æ å** å¨JDK1.6ä¹åï¼synchronized çæ§è½æ¯æ¯ ReenTrantLock å·®å¾å¤ãå ·ä½è¡¨ç¤ºä¸ºï¼synchronized å ³é®åååééçº¿ç¨æ°çå¢å ï¼ä¸éå¾é常严éãèReenTrantLock åºæ¬ä¿æä¸ä¸ªæ¯è¾ç¨³å®çæ°´å¹³ãæè§å¾è¿ä¹ä¾§é¢åæ äºï¼ synchronized å ³é®åè¿æé常大çä¼åä½å°ãåç»çææ¯åå±ä¹è¯æäºè¿ä¸ç¹ï¼æä»¬ä¸é¢ä¹è®²äºå¨ JDK1.6 ä¹å JVM å¢é对 synchronized å ³é®ååäºå¾å¤ä¼åã**JDK1.6 ä¹åï¼synchronized å ReenTrantLock çæ§è½åºæ¬æ¯æå¹³äºãæä»¥ç½ä¸é£äºè¯´å 为æ§è½æéæ© ReenTrantLock çæç« 齿¯éçï¼JDK1.6ä¹åï¼æ§è½å·²ç»ä¸æ¯éæ©synchronizedåReenTrantLockçå½±åå ç´ äºï¼èä¸èææºå¨æªæ¥çæ§è½æ¹è¿ä¸ä¼æ´ååäºåççsynchronizedï¼æä»¥è¿æ¯æå¡å¨synchronizedè½æ»¡è¶³ä½ çéæ±çæ åµä¸ï¼ä¼å èè使ç¨synchronizedå ³é®åæ¥è¿è¡åæ¥ï¼ä¼ååçsynchronizedåReenTrantLock䏿 ·ï¼å¨å¾å¤å°æ¹é½æ¯ç¨å°äºCASæä½**ã