java - Java中引用变量读写的原子性

标签 java multithreading concurrency atomic

首先引自 来自 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();

可以分为两步:

  1. 调用calcluate方法并获取一个值;我们称它为 val
  2. 以原子方式将 val 写入 emp

这意味着如果您尝试读取 empcalculate 函数仍在运行(或者,在它返回和值尚未返回之间的狭窄时间段内) t been written yet),你将得到任何恰好已经在 emp 中的值。其他线程不会被阻止读取它。如果你想这样做,你需要使用一些显式同步。

(请注意 - 原子性并不意味着“所有其他线程都将被阻塞,直到该值准备就绪。”它意味着“所有其他线程要么纯粹在操作完成之前看到状态,要么纯粹在操作完成之后看到状态, 但没有别的。”)

关于java - Java中引用变量读写的原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40774010/

相关文章:

c# - 如何从另一个线程中止单元测试?

java - 给主线程设置优先级和不设置优先级有什么区别?

java - 类级锁定 - 效率如何?

go - 如果写入从不在设计上相互竞争,那么使用 sync.RWMutex 的读取锁进行写入并使用其写入锁进行读取是否安全?

java - 如何传递字符串、日期等数据类型

java - Hibernate OneToOne延迟加载和级联

java - 查找 Java 函数的开头和结尾

java - Netty FrameDecoder.decode 编码的最佳方式

recursion - 递归 Goroutines,告诉 Go 停止从 channel 读取的最简洁方法是什么?

concurrency - 餐饮哲学家的真实世界例子?