原理剖析(第002編)synchronized動作原理分析
原理剖析(第002編)synchronized動作原理分析
-
一、大まかに紹介する
二、特性
2.1反発性
2.2可視性
2.3秩序性
三、逆コンパイル表示バイトコード
3.1、逆コンパイル同期コードブロック
3.2、逆コンパイル同期方法
3.3、逆コンパイル小結
四、Javaオブジェクトヘッダ、Monitor
4.1、Javaオブジェクトヘッダ
4.2、Javaオブジェクトヘッダの役割
4.3、Monitorとは何ですか.
4.4、Monitorの下品な理解
4.5、Javaオブジェクトヘッダ、Monitorノット
五、ロックのタイプ
5.1、ヨーロック
5.2、軽量級錠
5.3、重量級錠
5.4、ロック分類小結
六、synchronizedロックまとめ画像
七、ダウンロードアドレス
https://gitee.com/ylimhhmily/SpringCloudTutorial.git
SpringCloudTutorial交流QQ群:235322432
SpringCloudTutorial交流微信群:微信コミュニケーション群QRコードピクチャーリンク
注目を歓迎して、あなたのはきっと私に対する最大の支持です!!!
-
-
一、大まかに紹介する
1、 synchronized Java ;
2、 , , ;
3、 , : ( )、 ( )、 ( );
4、 synchronized ;
二、特性
2.1反発性
1、 , , ;
2、 synchronized 、 、 , , , ,
, synchronized ;
2.2可視性
1、 , , ;
2、 , , ;
3、 , , , volatile , ;
2.3秩序性
1、 , ;
2、 , , , synchronized , , ;
3、 , ,TestSynchronized.java synchronized static test(){ i++, j++} ,
synchronized , N , i j 。
i++ j++ , , i++ , , j++ 。
三、逆コンパイル表示バイトコード
3.1、逆コンパイル同期コードブロック
1、 javap -verbose ( ), monitorenter、monitorexit ;
2、 , JVM :
monitorenter :
Each object is associated with a monitor. A monitor is locked if and only if it has an owner. The thread that executes monitorenter attempts to gain ownership of the monitor associated with objectref, as follows:
• If the entry count of the monitor associated with objectref is zero, the thread enters the monitor and sets its entry count to one. The thread is then the owner of the monitor.
• If the thread already owns the monitor associated with objectref, it reenters the monitor, incrementing its entry count.
• If another thread already owns the monitor associated with objectref, the thread blocks until the monitor's entry count is zero, then tries again to gain ownership.
monitorexit:
• The thread that executes monitorexit must be the owner of the monitor associated with the instance referenced by objectref.
• The thread decrements the entry count of the monitor associated with objectref. If as a result the value of the entry count is zero, the thread exits the monitor and is no longer its owner. Other threads that are blocking to enter the monitor are allowed to attempt to do so.
3、monitorenter JVM :
(monitor)。 monitor , monitorenter monitor , :
• monitor 0, monitor, 1, monitor 。
• monitor, , monitor 1.
• monitor, , monitor 0, monitor 。
4、monitorexit JVM :
• monitorexit objectref monitor 。
• ,monitor 1, 1 0, monitor, monitor 。 monitor monitor 。
3.2、逆コンパイル同期方法
1、 javap -verbose ( ), ACC_SYNCHRONIZED ;
2、 ACC_SYNCHRONIZED , JVM :
ACC_SYNCHRONIZED:
Method-level synchronization is performed implicitly, as part of method invocation and return.
A synchronized method is distinguished in the run-time constant pool's methodinfo structure by the ACCSYNCHRONIZED flag, which is checked by the method invocation instructions.
When invoking a method for which ACC_SYNCHRONIZED is set, the executing thread enters a monitor, invokes the method itself, and exits the monitor whether the method invocation completes normally or abruptly.
During the time the executing thread owns the monitor, no other thread may enter it.
If an exception is thrown during invocation of the synchronized method and the synchronized method does not handle the exception, the monitor for the method is automatically exited before the exception is rethrown out of the synchronized method.
3、ACC_SYNCHRONIZED JVM :
• 。 ACC_SYNCHRONIZED 。
• , ACC_SYNCHRONIZED,
• , , , 。
• , 。
• , , , , 。
3.3、逆コンパイル小結
monitorenter、 monitorexit, ACC_SYNCHRONIZED, Monitor , Monitor , Monitor , java 。
四、Javaオブジェクトヘッダ、Monitor
4.1、Javaオブジェクトヘッダ
1、 JVM , : 、 , 3、 4、 5 , “ ( )”;
2、 Java Mark Word( hashCode、 GC )、Klass Pointer( ,JVM )。
3、 Mark Word , , 1;
4.2、Javaオブジェクトヘッダの役割
1、Java , synchronized ;
2、 Java , synchronized , 、 jdk6 synchronized ;
3、 , Java , , Mark Word synchronized;
4、 , Java synchronized ;
4.3、Monitorとは何ですか.
Monitor , , ;
1、 “ ” 。 Monitor “ ”, “ ”, 。
2、 singal : “ ” “ ”, ( ), , “ ” , 。
4.4、Monitorの下品な理解
1、Java Monitor, , , “ ”, “Monitor ”, “Intrinsic lock”。
2、Java , monitor , , Monitor , ( ) 。
3、 Java (HotSpot) ,monitor ObjectMonitor , HotSpot ObjectMonitor.hpp (http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/f2110083203d/src/share/vm/runtime/objectMonitor.hpp);
4.5、Javaオブジェクトヘッダ、Monitorノット
1、 , synchronized , synchronized ?
2、 jdk6 , , jdk6 ,synchronized 、 , synchronized ;
3、 “ -> -> ” , 、Java , jdk8 synchronizer.cpp (http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/runtime/synchronizer.cpp);
4、 “ -> ”, Monitor, jdk8 objectMonitor.cpp (http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/runtime/objectMonitor.cpp);
五、ロックのタイプ
-> -> -> , 。 , 。
5.1、ヨーロック
1、 : , , , , CAS ;
2、 :
----→ 01
¦
¦
↓ N
? ------------→ CAS Mark Word ID
¦ ↑ ¦ ¦
¦Y ¦ ¦ ¦N
↓ N ¦ ¦ ↓ Y
¦--→ Mark Word ID? -----¦ ¦Y ? ----------→ CAS ID,
¦ ¦ ¦ ¦ ,
¦ ¦Y ¦ ¦
¦ ↓ ¦ ¦
¦ 1 ←-------------¦ ¦
¦ ¦ ¦
¦ ¦ ¦N
¦ ↓ ¦
¦ ¦
¦ ¦
¦ ¦
¦--------------------------------------------------------------------¦
5.2、軽量級錠
1、 : , monitorenter monitorexit CAS 。
, CAS , 。
2、 :
----→ Lock Record ¦------→
¦ ¦ ¦
¦ ¦ ¦
↓ ¦ ↓
Mark Word Lock Record Header ¦ Mark Word
¦ ¦ ¦ ¦------------¦
¦ ¦ ¦ ¦ ¦
↓ ¦ ↓ ↓ ¦
, 00 --------------¦ CAS , ? ----→ N
¦ ¦ ¦
¦ ¦Y ¦
↓ ↓ ↓
N CAS ,
¦ ¦
¦ ¦
↓ ↓
¦ ¦
¦ ¦
¦ ↓
¦-------------------------------------------→
5.3、重量級錠
1、 , , , , ( Linxu pthread_mutex_lock );
2、 :
Y
----→ , --------------→ _owner==null? ------→
Mark Word Monitor ↑ ¦
¦ ¦N
¦ ↓ Y
¦ _owner==self ? -------→
¦ ¦
¦ ¦N
¦---------¦
¦
¦
¦
¦
¦
↓
ObjectWaiter _cxq ,CAS _cxq ObjectWaiter
¦
¦
↓
part
5.4、ロック分類小結
1、 , , monitorenter , , , -> -> 。
2、 fast_enter、fast_exit,jdk (http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/runtime/synchronizer.cpp);
3、 slow_enter、slow_exit,jdk (http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/runtime/synchronizer.cpp);
4、 enter、EnterI、exit,jdk (http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/runtime/objectMonitor.cpp);
六、synchronizedロックまとめ画像
七、ダウンロードアドレス
https://gitee.com/ylimhhmily/SpringCloudTutorial.git
SpringCloudTutorial交流QQ群:235322432
SpringCloudTutorial交流微信群:微信コミュニケーション群QRコードピクチャーリンク
注目を歓迎して、あなたのはきっと私に対する最大の支持です!!!
-