JAva syncronizedキーワードの詳細
2212 ワード
synchronizedキーワード.synchronizedメソッドとsynchronizedブロックの2つの使い方が含まれます.
1.synchronizedメソッド:synchronizedキーワードをメソッド宣言に追加することでsynchronizedメソッドを宣言します.次のようになります.
synchronizedメソッドはクラスメンバー変数へのアクセスを制御する:各クラスインスタンスはロックに対応し、各synchronizedメソッドはメソッドを呼び出すクラスインスタンスのロックを取得しなければならない.そうしないと、属するスレッドがブロックされ、メソッドが実行されると、ロックが独占され、メソッドから戻るまでロックが解放され、その後ブロックされたスレッドがロックを取得することができる.実行可能な状態に戻ります.このメカニズムは、synchronizedとして宣言されたすべてのメンバー関数のうち、実行可能な状態が1つしかない(クラスインスタンスに対応するロックが1つしか得られないため)クラスインスタンスごとに、クラスメンバー変数へのアクセス競合を効果的に回避するために、クラスメンバー変数へのアクセスが可能なすべての方法がsynchronizedとして宣言される限り、同じ時点で実行可能であることを保証する..
Javaでは、クラスインスタンスだけでなく、各クラスもロックに対応しています.これにより、クラスの静的メンバー関数をsynchronizedとして宣言し、クラスの静的メンバー変数へのアクセスを制御することもできます.
synchronizedメソッドの欠陥:大きなメソッドをsynchronizedと宣言すると効率に大きく影響します.典型的には、スレッドクラスのメソッドrun()をsynchronizedと宣言すると、スレッドのライフサイクル全体で実行されているため、このクラスのsynchronizedメソッドの呼び出しは成功しません.もちろん、クラスメンバー変数にアクセスするコードを特定のメソッドに配置してsynchronizedと宣言し、メインメソッドで呼び出すことでこの問題を解決することができますが、Javaはsynchronizedブロックというより良い解決策を提供しています.
2.synchronizedブロック:synchronizedキーワードでsynchronizedブロックを宣言します.構文は次のとおりです.
synchronizedブロックは、前述したようにクラスインスタンスまたはクラスであってもよいオブジェクトsyncObjectのロックを取得しなければならないコードブロックであり、具体的なメカニズムは前述したとおりである.任意のコードブロックに対して、ロックされたオブジェクトを任意に指定できるため、柔軟性が高い.
synchronized(this)に対するいくつかの理解
一、2つの同時スレッドが同じオブジェクトobjectのsynchronized(this)同期コードブロックにアクセスすると、1時間に1つのスレッドしか実行できない.別のスレッドは、現在のスレッドがこのコードブロックを実行するまで待たなければなりません.
二、しかしながら、あるスレッドがobjectのsynchronized(this)同期コードブロックにアクセスする場合、別のスレッドは、object内の非synchronized(this)同期コードブロックにアクセスすることができる.
三、特に重要なのは、1つのスレッドがobjectのsynchronized(this)同期コードブロックにアクセスすると、他のスレッドがobject内の他のすべてのsynchronized(this)同期コードブロックへのアクセスがブロックされることである.
四、第三の例は、他の同期コードブロックにも同様に適用される.すなわち、objectのsynchronized(this)同期コードブロックにスレッドがアクセスすると、このobjectのオブジェクトロックが得られる.その結果、objectオブジェクトのすべての同期コード部分への他のスレッドのアクセスが一時的にブロックされる.
五、synchronizedキーワードは継承できない.すなわち、ベースクラスのメソッドsynchronized f(){}は、継承クラスでは自動的にsynchronized f(){}ではなく、f(){}となる.クラスを継承するには、synchronizedメソッドを明示的に指定する必要があります.
六、以上の規則は他のオブジェクトロックにも適用する
1.synchronizedメソッド:synchronizedキーワードをメソッド宣言に追加することでsynchronizedメソッドを宣言します.次のようになります.
public synchronized void accessVal(int newVal);
synchronizedメソッドはクラスメンバー変数へのアクセスを制御する:各クラスインスタンスはロックに対応し、各synchronizedメソッドはメソッドを呼び出すクラスインスタンスのロックを取得しなければならない.そうしないと、属するスレッドがブロックされ、メソッドが実行されると、ロックが独占され、メソッドから戻るまでロックが解放され、その後ブロックされたスレッドがロックを取得することができる.実行可能な状態に戻ります.このメカニズムは、synchronizedとして宣言されたすべてのメンバー関数のうち、実行可能な状態が1つしかない(クラスインスタンスに対応するロックが1つしか得られないため)クラスインスタンスごとに、クラスメンバー変数へのアクセス競合を効果的に回避するために、クラスメンバー変数へのアクセスが可能なすべての方法がsynchronizedとして宣言される限り、同じ時点で実行可能であることを保証する..
Javaでは、クラスインスタンスだけでなく、各クラスもロックに対応しています.これにより、クラスの静的メンバー関数をsynchronizedとして宣言し、クラスの静的メンバー変数へのアクセスを制御することもできます.
synchronizedメソッドの欠陥:大きなメソッドをsynchronizedと宣言すると効率に大きく影響します.典型的には、スレッドクラスのメソッドrun()をsynchronizedと宣言すると、スレッドのライフサイクル全体で実行されているため、このクラスのsynchronizedメソッドの呼び出しは成功しません.もちろん、クラスメンバー変数にアクセスするコードを特定のメソッドに配置してsynchronizedと宣言し、メインメソッドで呼び出すことでこの問題を解決することができますが、Javaはsynchronizedブロックというより良い解決策を提供しています.
2.synchronizedブロック:synchronizedキーワードでsynchronizedブロックを宣言します.構文は次のとおりです.
synchronized(syncObject) {
//
}
synchronizedブロックは、前述したようにクラスインスタンスまたはクラスであってもよいオブジェクトsyncObjectのロックを取得しなければならないコードブロックであり、具体的なメカニズムは前述したとおりである.任意のコードブロックに対して、ロックされたオブジェクトを任意に指定できるため、柔軟性が高い.
synchronized(this)に対するいくつかの理解
一、2つの同時スレッドが同じオブジェクトobjectのsynchronized(this)同期コードブロックにアクセスすると、1時間に1つのスレッドしか実行できない.別のスレッドは、現在のスレッドがこのコードブロックを実行するまで待たなければなりません.
二、しかしながら、あるスレッドがobjectのsynchronized(this)同期コードブロックにアクセスする場合、別のスレッドは、object内の非synchronized(this)同期コードブロックにアクセスすることができる.
三、特に重要なのは、1つのスレッドがobjectのsynchronized(this)同期コードブロックにアクセスすると、他のスレッドがobject内の他のすべてのsynchronized(this)同期コードブロックへのアクセスがブロックされることである.
四、第三の例は、他の同期コードブロックにも同様に適用される.すなわち、objectのsynchronized(this)同期コードブロックにスレッドがアクセスすると、このobjectのオブジェクトロックが得られる.その結果、objectオブジェクトのすべての同期コード部分への他のスレッドのアクセスが一時的にブロックされる.
五、synchronizedキーワードは継承できない.すなわち、ベースクラスのメソッドsynchronized f(){}は、継承クラスでは自動的にsynchronized f(){}ではなく、f(){}となる.クラスを継承するには、synchronizedメソッドを明示的に指定する必要があります.
六、以上の規則は他のオブジェクトロックにも適用する