Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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_Multithreading_Primitive - Fatal编程技术网

Java中原语的同步更新

Java中原语的同步更新,java,multithreading,primitive,Java,Multithreading,Primitive,我正在解决一个问题,在多线程环境中迭代计算某个答案的下限 在计算过程中,可能会有许多线程试图更新公共基元变量。对我来说,他们中的哪一个会成功地写出它的价值,哪一个会失败并不重要 我唯一担心的问题是,一个线程可能会写入原语的一部分(例如,第一个字节),另一个线程可能会写入另一部分(例如,最后一个字节),因此该原语的值与线程试图写入的值无关 如果能链接到官方文献,我们将不胜感激 提前谢谢 我唯一担心的问题是 如果可能的话,其中一个线程 会写出原语的一部分 (例如,第一个字节)和另一个 写入另一部分(

我正在解决一个问题,在多线程环境中迭代计算某个答案的下限

在计算过程中,可能会有许多线程试图更新公共基元变量。对我来说,他们中的哪一个会成功地写出它的价值,哪一个会失败并不重要

我唯一担心的问题是,一个线程可能会写入原语的一部分(例如,第一个字节),另一个线程可能会写入另一部分(例如,最后一个字节),因此该原语的值与线程试图写入的值无关

如果能链接到官方文献,我们将不胜感激

提前谢谢

我唯一担心的问题是 如果可能的话,其中一个线程 会写出原语的一部分 (例如,第一个字节)和另一个 写入另一部分(例如最后一个字节) 因此,它的价值 原语将不属于 线程正在尝试写入

引用:

如果未指定双精度或长变量 声明为volatile,则为 加载、存储、读取和删除的目的 写下他们被视为 它们是两个32位的变量 每个:规则要求的任何地方 在这些行动中,有两项行动是: 已执行,每32位一半一个。 数据的64位 对双变量或长变量进行编码 分为两个32位量 依赖于实现。负载, 在上存储、读取和写入操作 易变变量是原子变量,即使 变量的类型为双精度或双精度 长

对其他原语的写入总是原子的。但是,如果它们没有声明为volatile,那么在任意长的时间内,其他线程可能看不到更新

我唯一担心的问题是 如果可能的话,其中一个线程 会写出原语的一部分 (例如,第一个字节)和另一个 写入另一部分(例如最后一个字节) 因此,它的价值 原语将不属于 线程正在尝试写入

引用:

如果未指定双精度或长变量 声明为volatile,则为 加载、存储、读取和删除的目的 写下他们被视为 它们是两个32位的变量 每个:规则要求的任何地方 在这些行动中,有两项行动是: 已执行,每32位一半一个。 数据的64位 对双变量或长变量进行编码 分为两个32位量 依赖于实现。负载, 在上存储、读取和写入操作 易变变量是原子变量,即使 变量的类型为双精度或双精度 长


对其他原语的写入总是原子的。但是,如果它们没有声明为volatile,那么在任意长的时间内,其他线程可能看不到更新。

java.util.concurrent.atomic.atomic*类很好地解决了这个问题。正如Michael指出的,对非64位原语的写入是原子的,但其他线程可能看不到新值——可能永远也看不到


在计算过程中,您可能不关心过时的读取,但无法保证读取最终解决方案的线程将看到正确的值,除非您将原语设置为volatile,同步对原语的访问,或者使用
AtomicWhatever

java.util.concurrent.atomic.atomic*
类很好地解决了这个问题。正如Michael指出的,对非64位原语的写入是原子的,但其他线程可能看不到新值——可能永远也看不到


您可能不关心计算期间的过时读取,但无法保证读取最终解决方案的线程将看到正确的值,除非您将原语设置为volatile、同步对原语的访问或使用
AtomicWhatever

我几乎可以肯定答案是:“没什么可担心的”。这条信息很棒。再次感谢。我几乎可以肯定答案是:“没什么可担心的”。这条信息很棒。再次感谢。