同步synchronized在位元組碼指令中的原理——T2103
阿新 • • 發佈:2021-01-10
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();
}
}