2009-12-30 74 views
1

这里的同步点是什么?这种同步的重点是什么?

为什么不只是使用mConnectedThread.write(out)

的代码片段是从BluetoothChat样品为Android (found here)

需要
/** 
* Write to the ConnectedThread in an unsynchronized manner 
* @param out The bytes to write 
* @see ConnectedThread#write(byte[]) 
*/ 
public void write(byte[] out) { 
    // Create temporary object 
    ConnectedThread r; 
    // Synchronize a copy of the ConnectedThread 
    synchronized (this) { 
     if (mState != STATE_CONNECTED) return; 
     r = mConnectedThread; 
    } 
    // Perform the write unsynchronized 
    r.write(out); 
} 

回答

2

同步,以确保你没有不一致的状态。

没有同步,代码是:

public void write(byte[] out) { 
    if (mState != STATE_CONNECTED) return; 
    mConnectedThread.write(out); 
} 

现在,如果连接到哪里if语句检查和方法调用之间关闭,mConnectedThread可能被指定为null,方法调用执行前。这将导致NullPointerException

+1

当然,不知道更多的连接仍然可以在同步块的结束和实际的write()调用之间关闭......现在可能会产生完全不同的错误。而且,如果ConnectThread在正常取消后处理write(),那么简单地将它分配给一个局部变量并检查null将是一种更简单的方法。 – PSpeed 2009-12-30 23:04:54

1

每当两个线程访问相同的数据(在这里,变量mStatemConnectedThread),他们必须使用“记忆障碍”,确保知名度。看起来这里的mStatemConnectedThread的原子性也很重要。

可视性意味着一个线程所做的更改将对另一个线程可见。优化可能会导致缓存值,以便更改仅对创建它们的线程可见。同步会导致任何写入都反映在主内存中,并且任何读取都会绕过本地缓存并针对主内存进行读取。理论上,如果没有同步,一个线程可能会设置mStatemConnectedThread,但其他线程可能永远不会“看到”这些更改,并且会永久等待该条件发生更改。

原子性意味着无法单独观察多个动作。从另一个线程的角度来看,没有发生任何变化,或者发生了所有变化。因此,例如,另一个线程永远不会看到mStateSTATE_CONNECTED,但在分配之前已读取mConnectedThread

1

锁需要一致性。 将mConnectedThread复制到单独的变量是因为写入 - 这是一个可能的长度操作 - 可以在锁之外完成。

+0

现货C程序员;)(没有投票给你) – 2009-12-30 22:30:15