Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这种同步有什么意义?_Java_Android_Synchronization - Fatal编程技术网

Java 这种同步有什么意义?

Java 这种同步有什么意义?,java,android,synchronization,Java,Android,Synchronization,这里的同步点是什么 为什么不直接使用mConnectedThread.writeout呢 代码片段来自Android的BluetoothChat示例 需要同步以确保您没有不一致的状态 如果没有同步,代码将是: public void write(byte[] out) { if (mState != STATE_CONNECTED) return; mConnectedThread.write(out); } 现在,如果要在if语句检查和方法调用之间关闭连接,那么在方法调用执行

这里的同步点是什么

为什么不直接使用mConnectedThread.writeout呢

代码片段来自Android的BluetoothChat示例


需要同步以确保您没有不一致的状态

如果没有同步,代码将是:

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

现在,如果要在if语句检查和方法调用之间关闭连接,那么在方法调用执行之前,可能会将mConnectedThread分配给null。这将导致NullPointerException。

需要同步以确保没有不一致的状态

如果没有同步,代码将是:

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

现在,如果要在if语句检查和方法调用之间关闭连接,那么在方法调用执行之前,可能会将mConnectedThread分配给null。这将导致NullPointerException。

每当两个线程访问此处相同的数据时,变量mState和mConnectedThread,它们都必须使用确保可见性的内存屏障。看来,mState和mConnectedThread的原子性在这里也很重要

可见性意味着一个线程所做的更改将对另一个线程可见。优化可能会导致缓存一个值,这样更改只对创建它们的线程可见。同步使任何写操作都反映在主内存中,而任何读操作都绕过本地缓存并针对主内存进行。理论上,如果没有同步,一个线程可以设置mState和mConnectedThread,但其他线程可能永远看不到这些更改,并永远等待该条件更改


原子性意味着不能单独观察多个动作。从另一个线程的角度来看,没有发生任何更改,或者所有更改都发生了。因此,例如,另一个线程永远看不到mState是STATE_CONNECTED,但在分配它之前读取mConnectedThread。

每当两个线程访问此处的相同数据时,变量mState和mConnectedThread,它们必须使用确保可见性的内存屏障。看来,mState和mConnectedThread的原子性在这里也很重要

可见性意味着一个线程所做的更改将对另一个线程可见。优化可能会导致缓存一个值,这样更改只对创建它们的线程可见。同步使任何写操作都反映在主内存中,而任何读操作都绕过本地缓存并针对主内存进行。理论上,如果没有同步,一个线程可以设置mState和mConnectedThread,但其他线程可能永远看不到这些更改,并永远等待该条件更改


原子性意味着不能单独观察多个动作。从另一个线程的角度来看,没有发生任何更改,或者所有更改都发生了。因此,例如,另一个线程可能永远看不到mState是STATE\u CONNECTED,但在分配它之前读取mConnectedThread。

需要锁以保持一致性。
将mConnectedThread复制到单独的变量是因为这样写操作(可能是长度操作)就可以在锁之外完成。

为了保持一致性,需要锁。
将mConnectedThread复制到单独的变量是因为写入操作(可能是长度操作)可以在锁之外完成。

当然,在不知道更多情况的情况下,在同步块结束和实际写入调用之间仍然可以关闭连接。。。这可能会产生一个完全不同的错误。而且,如果ConnectThread在cancel之后优雅地处理写操作,那么简单地将其分配给一个局部变量并检查null将是一种更简单的方法。当然,在不知道更多信息的情况下,在同步块结束和实际写调用之间的连接仍然可以关闭。。。这可能会产生一个完全不同的错误。而且,如果ConnectThread优雅地处理cancel之后的写操作,那么简单地将其分配给一个局部变量并检查null将是一种更简单的方法。