0

私たちが持っているとしましょう

class A {
    synchronized void m1() {
    }
    synchronized void m2() {
    }
    void m3() {
    }
    static void m6() {
        synchronized(this){
        }
    }
}

およびクラス A a1&a2 の 2 つのインスタンス。

ここで、インスタンス a1 を持つスレッド t1 がメソッド m1 を呼び出す場合、インスタンス a1 を持つスレッド t2 は、t1 が m1 の実行を終了するまでメソッド m1 を実行できないという制限のみがあります。そして、インスタンス a2 を持つ t2 は m1() を実行できます。

今私の疑問は、a1 を持つスレッド t1 は、m1 の実行中に他のメソッド (m1 を除く) を並列に実行できますか?

b/w 同期ブロックと同期方式の違いは何ですか? 違いは、ブロックの同期範囲が狭いため効率的であるということだけですか?

「パラメーターとしてブロックに提供された式が null に評価される場合、同期ブロックは java.lang.NullPointerException をスローする可能性がある」という記事を読みました。

常に "this" を同期ブロックへのパラメーターとして使用するため、静的メソッド内で同期ブロックを使用するケースは常にあります。静的メソッドを実行するためにオブジェクト インスタンスを必要としないためです。

私はどこでそれを誤解しましたか?

4

3 に答える 3

4

ここで、インスタンス a1 を持つスレッド t1 がメソッド m1 を呼び出す場合、インスタンス a1 を持つスレッド t2 は、t1 が m1 の実行を終了するまでメソッド m1 を実行できないという制限のみがあります。そして、インスタンス a2 を持つ t2 は m1() を実行できます。

正解です。両方のスレッドがsynchronized同じインスタンス上にあるため、最初のスレッドがThread実行され、2 番目のスレッドがThread待機します。

今私の疑問は、a1 を持つスレッド t1 は、m1 の実行中に他のメソッド (m1 を除く) を並列に実行できますか?

はい、これは再入可能同期として知られています。このチュートリアルの最後を見てください。

b/w 同期ブロックと同期方式の違いは何ですか? 違いは、ブロックの同期範囲が狭いため効率的であるということだけですか?

ブロックは任意のsynchronizedインスタンスで使用できます。メソッドは暗黙的にsynchronized同期します。実際のクリティカル セクションの周囲にのみ、できるだけ頻繁にブロックthisを使用するようにしてください。synchronized

「パラメータとしてブロックに提供された式がnullに評価される場合、同期ブロックはjava.lang.NullPointerExceptionをスローする可能性がある」という記事を見つけました。

以下

synchronized(null) {...}

投げNullPointerExceptionます。

于 2013-10-07T15:51:12.790 に答える