【发布时间】:2019-09-28 12:19:48
【问题描述】:
我最近在阅读 volatile 字段是线程安全的,因为
当我们对变量使用 volatile 关键字时,所有线程都会读取 它的值直接从内存中获取,不缓存
所以我想知道,对于非易失性字段,线程会从哪里读取其值?我以为一切都存储在内存中。
【问题讨论】:
-
寄存器不是直接的“内存”,所以有些东西不是内存,可以放置变量。
-
可以将非易失性字段(例如“private int x”)存储在寄存器中吗?如果是,那是如何确定的?
-
每个
static变量和每个成员变量在主内存中都有一个位置,但是多处理器系统中的每个CPU 都可以保留自己的本地副本。这就是下面回答的“缓存”。 “同步”系统中不同 CPU 的缓存是昂贵的。因此,Java 语言不会这样做,除非在程序员知道在另一个线程中需要一个线程更改的值的特殊点。当您将变量声明为volatile时,您是在告诉编译器您需要对变量的每次访问进行同步。 -
嗨@Solomon,所以我假设同步不同缓存的 CPU 可能很昂贵,但不像下面的答案之一所暗示的那样直接从内存访问东西那么昂贵?跨度>
-
@Dave,在大多数多处理器架构中,没有“直接访问事物”之类的东西。 所有 访问都经过缓存。 en.wikipedia.org/wiki/Cache_(computing)
标签: java multithreading memory volatile