Java 中引用变量的读写原子性
Atomicity of Reads and Writes for Reference Variables in Java
首先引自
来自 JLS 8 Sec 17.7
Writes to and reads of references are always atomic, regardless of
whether they are implemented as 32-bit or 64-bit values.
这是让我感到困惑的场景,给定 Employee class 和此 class 中称为计算的方法 returns 对 Employee 实例的引用。
Employee emp = calculate();
当对变量的写入是原子的时,这意味着在完成原子操作之前没有其他线程可以访问该变量,并且在给定的赋值示例中,写入的原子性是否包括右侧的评估赋值(无论多么复杂),或者写的原子性只适用于右侧被完全评估时,然后写操作才真正完成。
换句话说,我问的是在 calculate()
的求值过程中,其他线程对 emp
变量的访问是否被拒绝,或者只有当赋值已完全评估并且写入操作 emp
start?
抱歉说来话长,而且
非常感谢!
写入的原子性意味着 当您准备好存储值时,写入将以这样的方式完成,即每个线程要么 (1) 读取以前的值或 (2) 读取新值,但绝不会损坏任何东西。在你的例子中,执行语句的逻辑
emp = calcluate();
可以分为两步:
- 调用
calcluate
方法,获取一个值;我们称它为 val
.
- 以原子方式将
val
写入 emp
。
这意味着,如果您在 calculate
函数仍在运行时尝试读取 emp
(或者,在它 returns 和值尚未运行之间的狭窄时间段内)尚未写入),您将获得 emp
中已经存在的任何值。其他线程不会被阻止读取它。如果你想这样做,你需要使用一些显式同步。
(注意 - 原子性并不意味着 "all other threads will be blocked until the value is ready." 它意味着 "all other threads will either see the state purely before the operation is done or purely after the operation is done, but nothing else.")
首先引自 来自 JLS 8 Sec 17.7
Writes to and reads of references are always atomic, regardless of whether they are implemented as 32-bit or 64-bit values.
这是让我感到困惑的场景,给定 Employee class 和此 class 中称为计算的方法 returns 对 Employee 实例的引用。
Employee emp = calculate();
当对变量的写入是原子的时,这意味着在完成原子操作之前没有其他线程可以访问该变量,并且在给定的赋值示例中,写入的原子性是否包括右侧的评估赋值(无论多么复杂),或者写的原子性只适用于右侧被完全评估时,然后写操作才真正完成。
换句话说,我问的是在 calculate()
的求值过程中,其他线程对 emp
变量的访问是否被拒绝,或者只有当赋值已完全评估并且写入操作 emp
start?
抱歉说来话长,而且 非常感谢!
写入的原子性意味着 当您准备好存储值时,写入将以这样的方式完成,即每个线程要么 (1) 读取以前的值或 (2) 读取新值,但绝不会损坏任何东西。在你的例子中,执行语句的逻辑
emp = calcluate();
可以分为两步:
- 调用
calcluate
方法,获取一个值;我们称它为val
. - 以原子方式将
val
写入emp
。
这意味着,如果您在 calculate
函数仍在运行时尝试读取 emp
(或者,在它 returns 和值尚未运行之间的狭窄时间段内)尚未写入),您将获得 emp
中已经存在的任何值。其他线程不会被阻止读取它。如果你想这样做,你需要使用一些显式同步。
(注意 - 原子性并不意味着 "all other threads will be blocked until the value is ready." 它意味着 "all other threads will either see the state purely before the operation is done or purely after the operation is done, but nothing else.")