我正在看蓝牙聊天示例,但我不明白为什么在下面的代码中将它同步到本地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);
}
最佳答案
在ConnectedThread对象上未同步。它在this
上同步,因此当当前线程需要它们时,没有其他线程可以修改mState
和mConnectedThread
。
可能使您感到困惑的评论说,这是因为它正在同步ConnectedThread
的副本(也就是说,它会将引用的副本复制到ConnectedThread
,并且复制过程已同步)。该注释并不表示它正在ConnectedThread
的副本上同步。
该函数之所以在使用它之前将对ConnectedThread对象的引用放在本地变量r
中的原因是,在调用write
时无法同步整个对象,这可能是一个漫长的动作。
关于java - Java在对象的副本而不是实际的对象上进行同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15046685/