我正在看蓝牙聊天示例,但我不明白为什么在下面的代码中将它同步到本地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上同步,因此当当前线程需要它们时,没有其他线程可以修改mStatemConnectedThread

可能使您感到困惑的评论说,这是因为它正在同步ConnectedThread的副本(也就是说,它会将引用的副本复制到ConnectedThread,并且复制过程已同步)。该注释并不表示它正在ConnectedThread的副本上同步。

该函数之所以在使用它之前将对ConnectedThread对象的引用放在本地变量r中的原因是,在调用write时无法同步整个对象,这可能是一个漫长的动作。

关于java - Java在对象的副本而不是实际的对象上进行同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15046685/

10-10 12:53