静的型と非静的型の両方のJava同期メソッドが、Java同期コードの書き込み中に並行して実行される可能性はありますか?Javaのメソッドの同期
答えて
私はまだ質問を理解していません。私はあなたのコード例では混乱しています。静的メソッドは "this.counter"を参照していますが、 "counter"は静的です。いずれにしても
、再状態に他の答えのいくつか、考えてみます。
public static synchronized classMethod() {....}
public synchronized instanceMethod() {...}
「同期」は、各場合に2つの異なるものを意味します。静的なclassMethodでは、 "synchronized"はクラスオブジェクトの(Counter.class)モニターに適用され、instanceMethodの "synchronized"はオブジェクトインスタンス( "this")モニターに適用されます。
したがって、classMethodとinstanceMethodは互いにロックされません。 instanceMethodは別の非静的同期メソッドをブロックしますが、classMethodは他の静的同期メソッドをブロックします。
静的メソッドはクラスオブジェクトで同期されますが、非静的メソッドは呼び出されるクラスの特定のインスタンスで同期されます。したがって、それらは一般に異なるオブジェクト上で同期されるので、並列に実行することができる。
class MyClass
{
static synchronized void staticMethod1()
{
doSomething();
}
static void staticMethod2()
{
synchronized(MyClass.class)
{
doSomething();
}
}
synchronized void method1()
{
doSomething();
}
void method2()
{
synchronized(this)
{
doSomething();
}
}
}
あなたはクラスを持っている場合は、「テスト:次の例staticMethod1
で
は、後者のバージョンは、明示的に同期されているオブジェクトのみを使用することをmethod2
と同じであるstaticMethod2
とmethod1
と本質的に同じです静的でない場合はthis
(Testクラスのインスタンス)で同期し、staticはTest.class
(つまりjava.lang.Classクラスのインスタンス)で同期します。だから、そうです、それはまったく別のオブジェクトなので、並行して実行できます。
Java同期は、monitorの概念に基づいています。すべてのオブジェクトはモニターであり、同期されたコードのすべての部分はモニター・オブジェクトを参照します。同期された静的メソッドの場合、これはクラスオブジェクトです。同期されたインスタンスメソッドの場合はインスタンスです。同期ブロックの場合、モニター・オブジェクトが明示的に指定されます。
重要な点:2つのスレッドは、同じモニターオブジェクトで同期されていない場合、同期したコードを並列に実行できます。同期された静的メソッドと同期されたインスタンスメソッドがある場合、それらは同じモニターを持つことができないので、それらは並行して実行できます。
メソッドがロックされていない、オブジェクトがロックされています。別のオブジェクトを使用して、同じ同期メソッド内に2つのスレッドを持つことができます。ただし、同じオブジェクトの異なる同期メソッドを実行する2つのスレッドを持つことはできません。
静的メソッドと非静的メソッドは同じオブジェクトをロックしません。
True - メソッドシグネチャに同期させることは、メソッド本体が "synchronized(this){...}"か "synchronized(Foo.class){...}"のいずれかにラップするのと同じです静的かどうか。メソッド本体でsynchronizedを明示的に使用すると、ロックするオブジェクトのモニターをより正確に制御できます。 – wrschneider
また、 'wait()'を実行している場合は、同期ブロック内にスレッドをいくつでも持つことができますが、実行中のスレッドは1つだけです。 –
- 1. jsfとjavaの同期メソッドのベストプラクティス
- 2. 非同期ループ内の非同期メソッド
- 3. C#の同期メソッド
- 4. 同期メソッドのオーバーライド
- 5. 同期メソッドとJavaの同期ブロックの違いは何ですか?
- 6. 別の同期メソッド内で同期メソッドを参照する
- 7. Javaのスレッド/同期
- 8. モデルのJava同期
- 9. 同じオブジェクトの同期メソッドから同期メソッドを呼び出す
- 10. RubyCocoaの非同期メソッド
- 11. のXmlWriter非同期メソッド
- 12. 非同期メソッドのコードカバレッジ
- 13. Java:同期メソッドの例外と書き込みの可視性
- 14. Java同期オブジェクト?
- 15. JAVA同期
- 16. Java同期ブロック
- 17. Javaクラスのrunメソッドを同期させる
- 18. javaに同期したネイティブコードからのメソッド
- 19. Java EEの非同期メソッドを使用したトランザクション管理
- 20. Java用スレッドの同期
- 21. Javaの同期問題
- 22. Javaでの非同期ノンブロッキングリモートロギング?
- 23. Javaのスレッド - 同期(本)
- 24. Javaの同期とスレッド
- 25. メモリモデルからのJava同期
- 26. Javaでのスレッドと同期
- 27. Java同期の混乱
- 28. ハッシュテーブルとJavaでの同期
- 29. JavaのTCP同期方法
- 30. メール同期Javaで
質問をより正確にするためにコードサンプルを投稿していただけますか? – wrschneider
@ wrschneider99今、私に答えを教えてください – PENNY
なぜあなたのgetterは静的メソッドですが、あなたのセッターはインスタンスメソッドですか? –