淺談同步方法與同步代碼塊的區(qū)別
當(dāng)JVM執(zhí)行一個(gè)方法時(shí),執(zhí)行中的線程識(shí)別該方法的method_info結(jié)構(gòu)是否有ACC_SYNCHRONIZED標(biāo)記設(shè)置,然后它自動(dòng)獲取對(duì)象的鎖,調(diào)用方法,最后釋放鎖。如果有異常發(fā)生,線程自動(dòng)釋放鎖。
同步化一個(gè)方法塊會(huì)超過JVM對(duì)獲取對(duì)象鎖和異常處理的內(nèi)置支持,要求以字節(jié)代碼顯式寫入功能。如果使用同步方法讀取一個(gè)方法的字節(jié)代碼,就會(huì)看到有十幾個(gè)額外的操作用于管理這個(gè)功能。
Java代碼
- public class Sync {
- private int i;
- public synchronized int synchronizedMethodGet() {
- return i;
- }
- public int synchronizedBlockGet() {
- synchronized( this ) {
- return i;
- }
- }
- }
反編譯出的字節(jié)碼:
Java代碼
- D:\Java\jdk1.6.0_02\bin>javap -c Sync
- Compiled from "Sync.java"
- public class Sync extends java.lang.Object{
- public Sync();
- Code:
- 0: aload_0
- 1: invokespecial #1; //Method java/lang/Object."
":()V - 4: return
- public synchronized int synchronizedMethodGet();
- Code:
- 0: aload_0
- 1: getfield #2; //Field i:I
- 4: ireturn
- public int synchronizedBlockGet();
- Code:
- 0: aload_0
- 1: dup
- 2: astore_1
- 3: monitorenter
- 4: aload_0
- 5: getfield #2; //Field i:I
- 8: aload_1
- 9: monitorexit
- 10: ireturn
- 11: astore_2
- 12: aload_1
- 13: monitorexit
- 14: aload_2
- 15: athrow
- Exception table:
- from to target type
- 4 10 11 any
- 11 14 11 any
- }
原文鏈接:http://wen866595.javaeye.com/blog/974851
【編輯推薦】