1

Bluetoothチャットの例を見ていますが、以下のコードでローカルのConnectedThreadオブジェクトのコピーに同期されている理由がわかりません。確かにrとmConnectedThreadは同じオブジェクトを指していますか?

public synchronized void write(byte[] out)
{
    // Create temporary object
    ConnectedThread r;

    // Synchronize a copy of the ConnectedThread
    synchronized (this)
    {

        if (mState != ICommsService.STATE_CONNECTED)
            return;

        r = mConnectedThread;
    }

    // Perform the write unsynchronized
    r.write(out);
}
4

1 に答える 1

1

ConnectedThreadオブジェクトでは同期されません。で同期されるthisため、他のスレッドは変更できず、現在のスレッドがそれらを必要mStateとするときに変更できます。mConnectedThread

おそらくあなたを混乱させているコメントConnectedThreadは、それがのコピーを同期している(つまり、への参照のコピーを作成ConnectedThreadし、コピープロセスが同期されている)と言っています。コメントは、のコピーで同期ているとは言っていませんConnectedThread

また、関数がConnectedThreadオブジェクトへの参照を使用する前にローカル変数に入れる理由は、rを呼び出すときにオブジェクト全体を同期できないためwriteです。これは長いアクションになる可能性があります。

于 2013-02-23T23:03:23.253 に答える