淺談同步方法與同步代碼塊的區別
作者:wen866595
當JVM執行一個方法時,執行中的線程識別該方法的method_info結構是否有ACC_SYNCHRONIZED標記設置,然后它自動獲取對象的鎖,調用方法,最后釋放鎖。如果有異常發生,線程自動釋放鎖。
當JVM執行一個方法時,執行中的線程識別該方法的method_info結構是否有ACC_SYNCHRONIZED標記設置,然后它自動獲取對象的鎖,調用方法,最后釋放鎖。如果有異常發生,線程自動釋放鎖。
同步化一個方法塊會超過JVM對獲取對象鎖和異常處理的內置支持,要求以字節代碼顯式寫入功能。如果使用同步方法讀取一個方法的字節代碼,就會看到有十幾個額外的操作用于管理這個功能。
Java代碼
- public class Sync {
- private int i;
- public synchronized int synchronizedMethodGet() {
- return i;
- }
- public int synchronizedBlockGet() {
- synchronized( this ) {
- return i;
- }
- }
- }
反編譯出的字節碼:
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
【編輯推薦】
責任編輯:金賀
來源:
JavaEye博客