Java Volatile关键字&;线程本地存储器

Java Volatile关键字&;线程本地存储器,java,thread-safety,jvm,heap,volatile,Java,Thread Safety,Jvm,Heap,Volatile,我对Java中volatile关键字的用法感到困惑。我在网上读了很多文章,但还是一无所获。我脑子里有很多问题想问: 首先,Wikipedia和许多博客都说所有的volatile变量都存储在线程本地内存中,而不是所有线程共享的主内存中!我有点困惑,它们是指堆栈内存吗?我知道每个线程都有自己的堆栈内存,在那里它存储自己的原始文本和对象引用 如果是这样,那么如果volatile变量是对象引用而不是原语文本,会发生什么情况?我猜所有对象都存储在堆空间中,而不是堆栈内存中 第二,你能用一个例子详细解释一下

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

首先,Wikipedia和许多博客都说所有的
volatile
变量都存储在线程本地内存中,而不是所有线程共享的主内存中!我有点困惑,它们是指
堆栈内存吗?我知道每个线程都有自己的
堆栈内存
,在那里它存储自己的原始文本和对象引用

如果是这样,那么如果
volatile
变量是对象引用而不是原语文本,会发生什么情况?我猜所有对象都存储在堆空间中,而不是堆栈内存中

第二,你能用一个例子详细解释一下
volatile
关键字是如何工作的,以及我们应该在什么时候使用它吗

首先,Wikipedia和许多博客都说,所有易失性变量都存储在线程本地内存中,而不是所有线程共享的主内存中

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

它们可能是指特定于单个处理器/核心的缓存。。。但这是硬件特有的东西。但这绝对不是“线程本地”。这个词的意思完全不同

如果是这样,那么如果volatile变量是一个对象引用而不是一个原始文本,会发生什么呢

没什么特别的。你的假设是错误的。易失性变量不存储在堆栈上

我知道每个线程都有自己的堆栈内存,它在其中存储自己的原始文本和对象引用

线程堆栈上存储的内容是:

  • 方法的局部变量
  • 方法的参数
  • 方法的返回地址等,以便CPU知道调用返回时去哪里,以及(可能)
  • JIT编译器处理的本地对象的状态不需要存储在堆中
方法的基本文本通常嵌入到代码本身中。字符串文本也在别处。(当这些文本被分配给局部变量时,它们将被保存在堆栈上…)

第二,你能用一个例子详细解释一下volatile关键字是如何工作的,以及我们应该在什么时候使用它吗


检查评论和相关问题。。。或谷歌“java易失性示例”。解释是多余的。

您在哪里读到易失性变量存储在线程本地内存中?我在Wikipedia条目中没有看到这样的断言。“Wikipedia和许多博客说,所有易失性变量都存储在线程本地内存中,而不是所有线程共享的主内存中!”。请提供带有链接的引文。这听起来不对。而且是比维基百科更好的阅读volatile的地方我想我犯了一个很大的错误,我不得不说易失性变量存储在主内存中,而不是本文中所说的线程本地内存:我的同位语@Stephen C:这里有一个例子是关于线程本地内存的。现在,线程本地内存和进程缓存内存有什么区别+1表示ur ans。但是,在“线程堆栈上存储的内容是:”中,您没有提到在方法内部创建的对象的参考值。这是否意味着在方法中创建的对象将存储在堆栈itshelf中?不在堆中?在方法中创建的对象的引用不需要特别提及。它们可能存储在局部变量中(在堆栈上…已经讨论过),也可能存储在类变量、实例变量或数组中(在堆中)。我的最后一点是指一些JIT编译器在启用“转义分析”时可能执行的特定优化。在这种情况下,整个对象存储在堆栈内存中。如果JIT编译器可以推断出有问题的对象无法从当前方法“转义”,则可以执行此优化。