我正在阅读Android示例中的BluetoothChatService.java
文件,有一件事让我感到困惑。
synchronized(this)
。有人可以解释使用不同技术的原因吗?
源代码可在BluetoothChatService.java获得,以下是我正在谈论的一些片段:
private int mState;
// Constants that indicate the current connection state
public static final int STATE_NONE = 0;
public static final int STATE_LISTEN = 1;
public static final int STATE_CONNECTING = 2;
public static final int STATE_CONNECTED = 3;
同步方法:
public synchronized void start() {
...
setState(STATE_LISTEN);
...
}
synchronized块(班级):
if (socket != null) {
synchronized (BluetoothChatService.this) {
switch (mState) {
case STATE_LISTEN:
case STATE_CONNECTING:
// Situation normal. Start the connected thread.
connected(socket, socket.getRemoteDevice(),
mSocketType);
break;
case STATE_NONE:
case STATE_CONNECTED:
// Either not ready or already connected. Terminate new socket.
try {
socket.close();
} catch (IOException e) {
Log.e(TAG, "Could not close unwanted socket", e);
}
break;
}
}
}
已同步(此):
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);
}
答案 0 :(得分:3)
在所有情况下,锁定都在BluetoothChatService
的当前实例上进行。
1- synchronized (BluetoothChatService.this)
,可以是BluetoothChatService
内的匿名类。为了引用BluetoothChatService
。
2- synchronized (this)
用于BluetoothChatService的任何成员函数内。这指向它的实例。
3- synchronized void start()
。 它相当于
void start(){ synchronized (this){
在前2个案例中,函数的其他部分(不在同步块内部),不需要线程安全,并且在函数名之前放置synchronized
关键字会使整个函数线程安全,因此将让你的应用程序必然慢。