1

我正在查看蓝牙聊天示例,但我不明白为什么在下面的代码中它在本地 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当前线程何时需要它们。

可能使您感到困惑的评论说,它正在同步 the 的副本ConnectedThread(也就是说,它使引用的副本成为 theConnectedThread并且复制过程是同步的)。该评论没有说它正在同步ConnectedThread.

而函数之所以在使用前将ConnectedThread对象的引用放在一个局部变量r中,是为了在调用的时候不能同步整个对象write,这可能是一个很长的动作。

于 2013-02-23T23:03:23.253 回答