public class ObjectCounter {
private static long numOfInstances = 0;
public ObjectCounter(){
synchronized(this){
numOfInstances++;
}
}
**public static synchronized long getCount(){
return numOfInstances;
}**
//vs//
**public static long getCount(){
return numOfInstances;
}**
}
いくつかのスレッドを実行すると、そのうちのいくつかは静的関数getCount()
を呼び出し、いくつかは新しいインスタンスを作成します。getCount()
その時点で実際のインスタンス数を呼び出すたびに取得したいと考えています。
- コード内の 2 つのオプションに違いはありますか?
- " " をロックした場合、コンストラクターが同期ブロックを終了するまで
this
呼び出すことができないということではありgetCount()
ません (getCount() で同期を記述しない場合としましょう)。 - コード内のどこかで同期ブロックを実行すると、同期ブロックのみがロックされますか?それともすべての "
this
" コードがロックされますか? - ここから編集: ありがとうございました。とても役に立ちましたが、回答に続いていくつか質問があります。
- 私が正しく理解していれば、同期された(this)ブロックは静的同期関数に影響を与えません(または接続されません)(numOfInstancesインクリメントではなくロック条件で)?
- インクリメントと getCount() 関数をスレッドセーフにするためのより良いオプションはありますか? (静的オブジェクトを開いて、synced(this) の代わりに synchronized(obj) を実行するように - 友人が提案)。
- ObjectCounter クラスに f1() メソッド (非静的) がある場合、1 つのスレッドが同期 (this) にあるときに、他のスレッドは f1() ブロック (同期クラスではないか、内部に同期ブロックがある) に入ることができますか?
- ObjectCounter に f1() メソッド (非静的) と f2() メソッド (非静的) がある場合、f1() に同期 (this) ブロックがあります。1 つのスレッドが synchronized(this) ブロックにある間、他のスレッドは f1() ブロックに入ることができますか (同期クラスではないか、内部に同期ブロックがあります)? (両方のスレッドが同じインスタンスで「動作」しているとしましょう)
`