0

LunarViewJava Lunar Lander サンプル (API-8 バージョン)のコードの一部を調べています。私はこの奇妙なことに気付きました:

public synchronized void restoreState(Bundle savedState) {
            synchronized (mSurfaceHolder) {
                        // ...
            }
}

なぜ二重同期?最初の同期では、一度に 1 つのスレッドしかこのメソッドに入ることができないことが保証されていませんか?

4

1 に答える 1

0

いいえ。

内部同期ブロックは mSurfaceHolder オブジェクトをロックしていますが、メソッドでの同期キーワードの使用はクラス インスタンス自体をロックしています。

synchronized キーワードは、基本的にインスタンス オブジェクトでロックを使用するようなものです。

public synchronized void doSomething()
{
    // Do some stuff
}

とまったく同じです...

public void doSomething()
{
    synchronized (this)
    {
        // Do some stuff
    }
}

オブジェクトへのロックとは、同期されたコードの一部が特定のオブジェクトをロックして実行されている場合、他の同期されたコード (ロックに同じオブジェクトを使用する) は、最初のコードが終了するまで待機する必要があることを意味します。

于 2013-03-28T23:13:09.570 に答える