静的型と非静的型の両方の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. Java同期メソッドの使用
- 2. Javaモニタの同期メソッド
- 3. jsfとjavaの同期メソッドのベストプラクティス
- 4. パラメータ値の周りのJava同期メソッド
- 5. 非同期メソッドの非同期メソッド
- 6. 待機と待機の同期メソッド(java)
- 7. Java同期メソッドが同期していません
- 8. 静的メソッドと非静的メソッドのJava同期
- 9. 非同期ループ内の非同期メソッド
- 10. 同期メソッドとJavaの同期ブロックの違いは何ですか?
- 11. C#の同期メソッド
- 12. 同期メソッドのオーバーライド
- 13. Entity Framework 6非同期メソッドと同期メソッドのパフォーマンス
- 14. 別の同期メソッド内で同期メソッドを参照する
- 15. Firebase Javaの同期verifyIdToken java
- 16. Java 8での非同期のfire-and-forgetメソッドのテスト
- 17. Javaのスレッド/同期
- 18. Javaのマルチスレッド同期
- 19. モデルのJava同期
- 20. Javaのメソッドとリスナー間の同期実行
- 21. Java:同期メソッドの例外と書き込みの可視性
- 22. 同期ブロック/メソッドとスケジューリングルールをJava同時実行で
- 23. 同じオブジェクトの同期メソッドから同期メソッドを呼び出す
- 24. 非同期メソッドを同期する
- 25. 非同期メソッド非同期に新
- 26. 同期または非同期メソッド
- 27. 同期メソッドのJUnitテスト
- 28. メソッドの子非同期func
- 29. RubyCocoaの非同期メソッド
- 30. spreedとメソッドの同期
質問をより正確にするためにコードサンプルを投稿していただけますか? – wrschneider
@ wrschneider99今、私に答えを教えてください – PENNY
なぜあなたのgetterは静的メソッドですが、あなたのセッターはインスタンスメソッドですか? –