3

静的同期メソッドが、異なるインスタンスを使用する 2 つのスレッドによって同時に呼び出されるとどうなりますか? 出来ますか?オブジェクトロックは非静的同期メソッドに使用されますが、静的同期メソッドにはどのタイプのロックが使用されますか?

4

4 に答える 4

6

メソッドを実装するオブジェクトで同期するのと同じClassなので、可能です。メカニズムは、メソッドが呼び出されたインスタンスを事実上無視します。

class Foo {
    private static synchronized doSomething() {
        // Synchronized code
    }
}

これを書くためのショートカットです:

class Foo {
    private static doSomething() {
        synchronized(Foo.class) {
            // Synchronized code
        }
    }
}
于 2012-09-19T10:10:05.300 に答える
6

可能です。

Classスレッドは on のようにクラスのオブジェクトをロックしますMyClass.class

JLS、セクション 8.4.3.6を参照してください。同期方法:

8.4.3.6. 同期されたメソッド

同期メソッドは、実行前にモニター (§17.1) を取得します。

クラス (静的) メソッドの場合、メソッドのクラスの Class オブジェクトに関連付けられたモニターが使用されます。

于 2012-09-19T10:10:11.140 に答える
0

静的同期メソッドは、タイプ java.lang.Class のインスタンスでロックを使用します。つまり、アクセス可能な各クラスは実行時に Class 型のオブジェクトによって表され、そのオブジェクトは静的な同期メソッドによって使用されます。

于 2012-09-19T10:11:41.300 に答える