"同步"方法vs." synchronized(Class.class)"

时间:2014-06-11 17:39:22

标签: java android multithreading synchronization synchronized

我正在阅读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);
    }

1 个答案:

答案 0 :(得分:3)

在所有情况下,锁定都在BluetoothChatService的当前实例上进行。

1- synchronized (BluetoothChatService.this)

当代码写在另一个类中时,使用

,可以是BluetoothChatService内的匿名类。为了引用BluetoothChatService

的实例

2- synchronized (this)

用于BluetoothChatService的任何成员函数内。这指向它的实例。

3- synchronized void start()

当需要同步整个方法时使用

。 它相当于

void start(){ synchronized (this){

在前2个案例中,函数的其他部分(不在同步块内部),不需要线程安全,并且在函数名之前放置synchronized关键字会使整个函数线程安全,因此将让你的应用程序必然慢。