首先引自 来自 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 类和该类中名为 calculate 的方法,该方法返回对 Employee 实例的引用。
Employee emp = calculate();
当对变量的写入是原子的时,这意味着在完成原子操作之前没有其他线程可以访问该变量,并且在给定的赋值示例中,写入的原子性是否包括对右侧的评估赋值(无论多么复杂),或者写的原子性只适用于右侧被完全评估时,然后写操作才真正完成。
换句话说,我想问的是,在 calculate()
的求值过程中,其他线程对 emp
变量的访问是否被拒绝,或者是否被拒绝只有当赋值的右侧被完全评估并且对 emp
的写操作开始时?
抱歉说来话长, 非常感谢!
最佳答案
写入的原子性意味着当您准备好存储值时,写入将以这样的方式完成,即每个线程 (1) 读取先前的值或 ( 2) 读取新值,但不会读取损坏的内容。在您的情况下,执行语句的逻辑
emp = calcluate();
可以分为两步:
- 调用
calcluate
方法并获取一个值;我们称它为val
。 - 以原子方式将
val
写入emp
。
这意味着如果您尝试读取 emp
而 calculate
函数仍在运行(或者,在它返回和值尚未返回之间的狭窄时间段内) t been written yet),你将得到任何恰好已经在 emp
中的值。其他线程不会被阻止读取它。如果你想这样做,你需要使用一些显式同步。
(请注意 - 原子性并不意味着“所有其他线程都将被阻塞,直到该值准备就绪。”它意味着“所有其他线程要么纯粹在操作完成之前看到状态,要么纯粹在操作完成之后看到状态, 但没有别的。”)
关于java - Java中引用变量读写的原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40774010/