java - Volatile 关键字和线程本地内存

标签 java jvm thread-safety heap-memory volatile

<分区>

我对 Java 中 volatile 关键字的用法感到困惑。我在互联网上阅读了很多文章,但仍然一无所获。我脑子里有很多问题想问:

首先,维基百科和许多博客都说所有volatile 变量都存储在所有线程共享的主内存之上的Thread-Local 内存 中!我有点困惑,它们是指 stack memory 吗?我知道每个线程都有自己的堆栈内存,它存储自己的原始文字和对象引用。

如果是这样,那么如果 volatile 变量是一个对象引用而不是原始文字会发生什么?我想所有的对象都存储在堆空间而不是堆栈内存中。

其次,您能否使用示例详细解释 volatile 关键字的工作原理以及我们应该在什么时候使用它?

最佳答案

First of all, Wikipedia and many blogs say that all volatile variables are stored in a Thread-Local memory over the main memory shared by all threads.

这是不正确的。 volatile 字段是实例或类(静态)变量,存储在堆中。

它们可能指的是特定于单个处理器/内核的高速缓存……但这是特定于硬件的东西。但这绝对不是“线程本地”。该术语的含义完全不同。

If so, then what happen if the volatile variable is an object reference and not a primitive literal?

没什么特别的。您的假设不正确。

易变变量不存储在堆栈中。实际上,如果您尝试对局部变量使用 volatile 关键字,您将遇到编译错误。 (这是没有意义的。堆栈上的变量仅对一个线程可见。可变语义是关于由不同线程共享的变量。)

I know each thread has his own stack memory where it stores its own primitive literals & objects references.

线程栈中存储的是:

  • 方法的局部变量,
  • 方法的参数,
  • 方法的返回地址等,以便 CPU 知道调用返回时去哪里,并且(可能)
  • JIT 编译器认为不需要存储在堆中的本地对象的状态。

方法的原始文字通常嵌入在代码本身中。字符串文字也在别处。 (当这些文字被分配给局部变量时,它们将被保存在堆栈中......)

Second, could you please explain in details using an example how the volatile keyword works and when we are supposed to use it?

查看评论和相关问题...或谷歌“java volatile example”。解释是多余的。

关于java - Volatile 关键字和线程本地内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14350974/

相关文章:

java - Spring - 如何重命名@Bean

java - 详细信息格式化程序错误 : Evaluations must contain either an expression or a block of well-formed statements

java - 在 Java 中绘制图元的最简单方法(不是 OpenGL)

java - HBase java.lang.OutOfMemoryError 错误

Java使用的内存多于堆大小(或正确大小的Docker内存限制)

java - 以线程安全的方式从数组列表返回对象?

java - 如何在 Java 桌面/Web 应用程序中安排任务以 1 周或 2 周的重复间隔运行

java - Java中有 "void"可以参与的语句吗?

c - POSIX 扩展可重入定义,涵盖线程安全

multithreading - iOS - 默认在哪个队列选择器上运行?