Java在对象副本而不是实际对象上进行同步

时间:2013-02-23 22:56:28

标签: java multithreading synchronization

我正在看蓝牙聊天示例,我不明白为什么在下面的代码中它会在本地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);
}

1 个答案:

答案 0 :(得分:1)

在ConnectedThread对象上 。它在this上同步,因此当前线程需要时,没有其他线程可以修改mStatemConnectedThread

可能让您感到困惑的评论说,它正在同步ConnectedThread的副本(也就是说,它会将引用的副本复制到ConnectedThread并且复制过程是同步的)。该评论并未说明正在同步 ConnectedThread的副本。

函数在使用它之前将对ConnectedThread对象的引用放在局部变量r中的原因是在调用write时可以不同步整个对象,这可能是长期行动。