# Synchronize å
³é®ååç
伿å¨ç¥ `Synchronize` å
³é®åæ¯è§£å³å¹¶åé®é¢å¸¸ç¨è§£å³æ¹æ¡ï¼æä»¥ä¸ä¸ç§ä½¿ç¨æ¹å¼:
- 忥æ®éæ¹æ³ï¼éçæ¯å½å对象ã
- 忥鿿¹æ³ï¼éçæ¯å½å `Class` 对象ã
- 忥åï¼éçæ¯ `{}` ä¸ç对象ã
å®ç°åçï¼
`JVM` æ¯éè¿è¿å
¥ãéåºå¯¹è±¡çè§å¨( `Monitor` )æ¥å®ç°å¯¹æ¹æ³ã忥åç忥çã
å
·ä½å®ç°æ¯å¨ç¼è¯ä¹åå¨åæ¥æ¹æ³è°ç¨åå å
¥ä¸ä¸ª `monitor.enter` æä»¤ï¼å¨éåºæ¹æ³åå¼å¸¸å¤æå
¥ `monitor.exit` çæä»¤ã
å
¶æ¬è´¨å°±æ¯å¯¹ä¸ä¸ªå¯¹è±¡çè§å¨( `Monitor` )è¿è¡è·åï¼èè¿ä¸ªè·åè¿ç¨å
·ææä»æ§ä»èè¾¾å°äºå䏿¶å»åªè½ä¸ä¸ªçº¿ç¨è®¿é®çç®çã
èå¯¹äºæ²¡æè·åå°éç线ç¨å°ä¼é»å¡å°æ¹æ³å
¥å£å¤ï¼ç´å°è·åéççº¿ç¨ `monitor.exit` ä¹åæè½å°è¯ç»§ç»è·åéã
æµç¨å¾å¦ä¸:

éè¿ä¸æ®µä»£ç æ¥æ¼ç¤º:
```java
public static void main(String[] args) {
synchronized (Synchronize.class){
System.out.println("Synchronize");
}
}
```
ä½¿ç¨ `javap -c Synchronize` å¯ä»¥æ¥çç¼è¯ä¹åçå
·ä½ä¿¡æ¯ã
```
public class com.crossoverjie.synchronize.Synchronize {
public com.crossoverjie.synchronize.Synchronize();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // class com/crossoverjie/synchronize/Synchronize
2: dup
3: astore_1
**4: monitorenter**
5: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
8: ldc #4 // String Synchronize
10: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
13: aload_1
**14: monitorexit**
15: goto 23
18: astore_2
19: aload_1
20: monitorexit
21: aload_2
22: athrow
23: return
Exception table:
from to target type
5 15 18 any
18 21 18 any
}
```
å¯ä»¥çå°å¨åæ¥åçå
¥å£ååºå£å嫿 `monitorenter,monitorexit`
æä»¤ã
## éä¼å
`synchronize` å¾å¤é½ç§°ä¹ä¸ºéééï¼`JDK1.6` ä¸å¯¹ `synchronize` è¿è¡äºåç§ä¼åï¼ä¸ºäºè½åå°è·ååéæ¾é带æ¥çæ¶èå¼å
¥äº`ååé`å`è½»éé`ã
### è½»éé
å½ä»£ç è¿å
¥åæ¥åæ¶ï¼å¦æåæ¥å¯¹è±¡ä¸ºæ éç¶ææ¶ï¼å½å线ç¨ä¼å¨æ 帧ä¸å建ä¸ä¸ªéè®°å½(`Lock Record`)åºåï¼åæ¶å°é对象çå¯¹è±¡å¤´ä¸ `Mark Word` æ·è´å°éè®°å½ä¸ï¼åå°è¯ä½¿ç¨ `CAS` å° `Mark Word` æ´æ°ä¸ºæåéè®°å½çæéã
å¦ææ´æ°**æå**ï¼å½å线ç¨å°±è·å¾äºéã
å¦ææ´æ°**失败** `JVM` ä¼å
æ£æ¥é对象ç `Mark Word` æ¯å¦æåå½å线ç¨çéè®°å½ã
妿æ¯å说æå½åçº¿ç¨æ¥æé对象çéï¼å¯ä»¥ç´æ¥è¿å
¥åæ¥åã
䏿¯å说ææå
¶ä»çº¿ç¨æ¢å äºéï¼å¦æåå¨å¤ä¸ªçº¿ç¨åæ¶ç«äºä¸æéï¼**è½»ééå°±ä¼è¨è为ééé**ã
#### è§£é
è½»ééçè§£éè¿ç¨ä¹æ¯å©ç¨ `CAS` æ¥å®ç°çï¼ä¼å°è¯éè®°å½æ¿æ¢åé对象ç `Mark Word` ãå¦ææ¿æ¢æååè¯´ææ´ä¸ªåæ¥æä½å®æï¼å¤±è´¥å说ææå
¶ä»çº¿ç¨å°è¯è·åéï¼è¿æ¶å°±ä¼å¤é被æèµ·ç线ç¨(æ¤æ¶å·²ç»è¨è为`ééé`)
è½»ééè½æåæ§è½çåå æ¯ï¼
è®¤ä¸ºå¤§å¤æ°é卿´ä¸ªåæ¥å¨æé½ä¸åå¨ç«äºï¼æä»¥ä½¿ç¨ `CAS` æ¯ä½¿ç¨äºæ¥å¼éæ´å°ãä½å¦æéç«äºæ¿çï¼è½»ééå°±ä¸ä½æäºæ¥çå¼éï¼è¿æ `CAS` çå¼éï¼çè³æ¯éééæ´æ
¢ã
### ååé
为äºè¿ä¸æ¥çéä½è·åéç代价ï¼`JDK1.6` ä¹åè¿å¼å
¥äºååéã
ååéçç¹å¾æ¯:éä¸åå¨å¤çº¿ç¨ç«äºï¼å¹¶ä¸åºç±ä¸ä¸ªçº¿ç¨å¤æ¬¡è·å¾éã
å½çº¿ç¨è®¿é®åæ¥åæ¶ï¼ä¼ä½¿ç¨ `CAS` å°çº¿ç¨ ID æ´æ°å°é对象ç `Mark Word` ä¸ï¼å¦ææ´æ°æååè·å¾ååéï¼å¹¶ä¸ä¹åæ¯æ¬¡è¿å
¥è¿ä¸ªå¯¹è±¡éç¸å
³ç忥忶é½ä¸éè¦å次è·åéäºã
#### éæ¾é
彿å¦å¤ä¸ä¸ªçº¿ç¨è·åè¿ä¸ªéæ¶ï¼ææååéç线ç¨å°±ä¼éæ¾éï¼éæ¾æ¶ä¼çå¾
å
¨å±å®å
¨ç¹(è¿ä¸æ¶å»æ²¡æåèç è¿è¡)ï¼æ¥ç伿忥æååéç线ç¨ï¼æ ¹æ®é对象ç®åæ¯å¦è¢«éæ¥å¤å®å°å¯¹è±¡å¤´ä¸ç `Mark Word` 设置为æ éæè
æ¯è½»ééç¶æã
ååéå¯ä»¥æé«å¸¦æåæ¥å´æ²¡æç«äºçç¨åºæ§è½ï¼ä½å¦æç¨åºä¸å¤§å¤æ°éé½åå¨ç«äºæ¶ï¼é£ååé就起ä¸å°å¤ªå¤§ä½ç¨ãå¯ä»¥ä½¿ç¨ `-XX:-userBiasedLocking=false` æ¥å
³éååéï¼å¹¶é»è®¤è¿å
¥è½»ééã
### å
¶ä»ä¼å
#### éåºæ§èªæ
å¨ä½¿ç¨ `CAS` æ¶ï¼å¦ææä½å¤±è´¥ï¼`CAS` ä¼èªæå次å°è¯ãç±äºèªææ¯éè¦æ¶è `CPU` èµæºçï¼æä»¥å¦æé¿æèªæå°±ç½ç½æµªè´¹äº `CPU`ã`JDK1.6`å å
¥äºéåºæ§èªæ:
> 妿æä¸ªéèªæå¾å°æåè·å¾ï¼é£ä¹ä¸ä¸æ¬¡å°±ä¼åå°èªæã