我正在看蓝牙聊天示例,我不明白为什么在下面的代码中它会在本地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);
}
答案 0 :(得分:1)
在ConnectedThread对象上 。它在this
上同步,因此当前线程需要时,没有其他线程可以修改mState
和mConnectedThread
。
可能让您感到困惑的评论说,它正在同步ConnectedThread
的副本(也就是说,它会将引用的副本复制到ConnectedThread
并且复制过程是同步的)。该评论并未说明正在同步 ConnectedThread
的副本。
函数在使用它之前将对ConnectedThread对象的引用放在局部变量r
中的原因是在调用write
时可以不同步整个对象,这可能是长期行动。