1. 程式人生 > 其它 >同步synchronized在位元組碼指令中的原理——T2103

同步synchronized在位元組碼指令中的原理——T2103

技術標籤:多執行緒java多執行緒

package 物件及變數的併發訪問2;

/**
 * 同步synchronized在位元組碼指令中的原理
 *
 *   在方法中使用synchronized關鍵字實現同步的原因是使用了flag標記ACC_SYNCHRONIZED.
 * 當呼叫方法時,呼叫指令會檢查方法的ACC_SYNCHRONIZED訪問標誌是否設定,如果設定了,
 * 執行執行緒先持有同步鎖,然後執行方法,最後在方法完成時釋放鎖。
 *
 *  public static synchronized void testMethod();
 *     descriptor: ()V
 *     flags: ACC_PUBLIC, ACC_STATIC, ACC_SYNCHRONIZED
 *     Code:
 *       stack=0, locals=0, args_size=0
 *          0: return
 *       LineNumberTable:
 *         line 26: 0
 *
 *       在翻編譯的位元組碼指令,對public synchronized.viod myMethod()方法使用
 *   了flag標記ACC_SYNCHRONIZED,說明此方法是同步的。
 *
 *
 *
 *
 *  public void myMethod();
 *     descriptor: ()V
 *     flags: ACC_PUBLIC
 *     Code:
 *       stack=2, locals=4, args_size=1
 *          0: aload_0
 *          1: dup
 *          2: astore_1
 *          3: monitorenter
 *          4: bipush        100
 *          6: istore_2
 *          7: aload_1
 *          8: monitorexit
 *          9: goto          17
 *         12: astore_3
 *         13: aload_1
 *         14: monitorexit
 *         15: aload_3
 *         16: athrow
 *         17: return
 *
 *         在位元組碼中使用monitorenter和monitorexit指令進行同步處理
 *         同步:按順序執行A和B這兩個業務,就是同步
 *         非同步:執行A業務的時候,B業務也在同時執行,這就是非同步。
 */
/** * 測試 */ class TestT213{ synchronized public static void testMethod(){ } public static void Test()throws InterruptedException{ testMethod(); } } public class T2103 { // synchronized public static void testMethod(){ // // } //如果使用synchronized程式碼塊,則使用monitorenter和monitorexit指令進行同步處理。
public void myMethod(){ synchronized (this){ int age=100; } } public static void main(String[] args)throws InterruptedException { // TestT213 testT213=new TestT213(); //testMethod(); T2103 t213=new T2103(); t213.myMethod(); } }