JVM-スレッド同期
言語レベルでマルチスレッドをサポートすることはjava言語の大きなメリットです.以前のjava同時シリーズのブログでは、関連する基礎知識を紹介していました.ここではjava仮想マシンのjavaマルチスレッドのサポートを見てみましょう.
JVMによるマルチスレッドのサポートは2種類ある:1反発:オブジェクトロックによる2連携:Objectクラスのwait,notify,notifyAllメソッドによる実現
反発について:
JVMのランタイムデータ領域では,メソッド領域とスタック領域は複数のスレッドで共有され,javaスタックとPCレジスタはスレッド独占であると述べた.したがって,マルチスレッドがメソッド領域とスタック領域にアクセスする際のデータセキュリティの問題を考慮する必要がある.
メソッド領域の共有データはクラス変数であり,スタック領域の共有データはオブジェクト変数である.(クラスのライフサイクルとオブジェクトのライフサイクルに関するブログを読むことがわかりません)
Java仮想機会は、各クラスまたはオブジェクトに自動的にロックを関連付けます.前者はクラスロック、後者はオブジェクトロックです.しかし、赤い部分は反発がオブジェクトロックで行われていると言っているのに、間違っているのではないでしょうか.
ここでは、jvmでは本当にオブジェクトロックのみであることを理解する必要があります.論理的にクラスロックはクラスのクラスオブジェクトにロックをかけることによって形成される.Javaでは、コードを書く方法をいくつか使用します.
上記の第1の形態では、クラスオブジェクトaがxxxxxxメソッドを呼び出すと、そのオブジェクトaのオブジェクトロックが取得され、メソッドが同期して実行されることが保証される.第2の形式thisは現在の方法を指すため、コードブロックを実行する際にもaのオブジェクトロックが得られる.第3の形態では、クラスAがxxxxメソッドを実行すると、クラスAのクラスロック、すなわちクラスAのClassオブジェクトのオブジェクトロックが得られる.第4の形態では、コードブロックが実行されると、クラスAのクラスロックが取得される.5つ目の形式は,オブジェクトmyLockのオブジェクトロックを利用する.
このことから,JVMでは,ロックはいずれもオブジェクトロックとして存在する.
JVMがオブジェクトを生成すると、各オブジェクトに自動的にロックが関連付けられます.これにより、各オブジェクトにオブジェクトロックがあり、各クラスにクラスロックがあることが保証されます.
コラボレーションについて:
JVMによるスレッド連携のサポートは,Objectクラスのwait,notify,notifyAllメソッドによって実現される.
waitメソッド:現在のオブジェクトロックを持つスレッドにオブジェクトロックを解放し、待機領域に入る
notifyメソッド:現在のオブジェクトロックを待機しているスレッドを起動します.
notifyAllメソッド:現在のオブジェクトロックを待っているすべてのスレッドを呼び覚ます
これらの方法の機能記述から、これらの方法は、同期方法または同期コードブロックで呼び出されなければならないことが容易に理解されるべきである.
JVMによるマルチスレッドのサポートは2種類ある:1反発:オブジェクトロックによる2連携:Objectクラスのwait,notify,notifyAllメソッドによる実現
反発について:
JVMのランタイムデータ領域では,メソッド領域とスタック領域は複数のスレッドで共有され,javaスタックとPCレジスタはスレッド独占であると述べた.したがって,マルチスレッドがメソッド領域とスタック領域にアクセスする際のデータセキュリティの問題を考慮する必要がある.
メソッド領域の共有データはクラス変数であり,スタック領域の共有データはオブジェクト変数である.(クラスのライフサイクルとオブジェクトのライフサイクルに関するブログを読むことがわかりません)
Java仮想機会は、各クラスまたはオブジェクトに自動的にロックを関連付けます.前者はクラスロック、後者はオブジェクトロックです.しかし、赤い部分は反発がオブジェクトロックで行われていると言っているのに、間違っているのではないでしょうか.
ここでは、jvmでは本当にオブジェクトロックのみであることを理解する必要があります.論理的にクラスロックはクラスのクラスオブジェクトにロックをかけることによって形成される.Javaでは、コードを書く方法をいくつか使用します.
( )
private synchronized void xxxXxx(){...};
( )
private void xxxXxx(){
synchronized(this){
...}
}
( )
private static synchronized void xxxXxx(){...};
( )
private static void xxxXxx(){
synchronized(this){
...}
}
:( )
private Object myLock=new Object();
上記の第1の形態では、クラスオブジェクトaがxxxxxxメソッドを呼び出すと、そのオブジェクトaのオブジェクトロックが取得され、メソッドが同期して実行されることが保証される.第2の形式thisは現在の方法を指すため、コードブロックを実行する際にもaのオブジェクトロックが得られる.第3の形態では、クラスAがxxxxメソッドを実行すると、クラスAのクラスロック、すなわちクラスAのClassオブジェクトのオブジェクトロックが得られる.第4の形態では、コードブロックが実行されると、クラスAのクラスロックが取得される.5つ目の形式は,オブジェクトmyLockのオブジェクトロックを利用する.
このことから,JVMでは,ロックはいずれもオブジェクトロックとして存在する.
JVMがオブジェクトを生成すると、各オブジェクトに自動的にロックが関連付けられます.これにより、各オブジェクトにオブジェクトロックがあり、各クラスにクラスロックがあることが保証されます.
コラボレーションについて:
JVMによるスレッド連携のサポートは,Objectクラスのwait,notify,notifyAllメソッドによって実現される.
waitメソッド:現在のオブジェクトロックを持つスレッドにオブジェクトロックを解放し、待機領域に入る
notifyメソッド:現在のオブジェクトロックを待機しているスレッドを起動します.
notifyAllメソッド:現在のオブジェクトロックを待っているすべてのスレッドを呼び覚ます
これらの方法の機能記述から、これらの方法は、同期方法または同期コードブロックで呼び出されなければならないことが容易に理解されるべきである.