Java Volatile关键字&;线程本地存储器
我对Java中Java Volatile关键字&;线程本地存储器,java,thread-safety,jvm,heap,volatile,Java,Thread Safety,Jvm,Heap,Volatile,我对Java中volatile关键字的用法感到困惑。我在网上读了很多文章,但还是一无所获。我脑子里有很多问题想问: 首先,Wikipedia和许多博客都说所有的volatile变量都存储在线程本地内存中,而不是所有线程共享的主内存中!我有点困惑,它们是指堆栈内存吗?我知道每个线程都有自己的堆栈内存,在那里它存储自己的原始文本和对象引用 如果是这样,那么如果volatile变量是对象引用而不是原语文本,会发生什么情况?我猜所有对象都存储在堆空间中,而不是堆栈内存中 第二,你能用一个例子详细解释一下
volatile
关键字的用法感到困惑。我在网上读了很多文章,但还是一无所获。我脑子里有很多问题想问:
首先,Wikipedia和许多博客都说所有的volatile
变量都存储在线程本地内存中,而不是所有线程共享的主内存中!我有点困惑,它们是指堆栈内存吗?我知道每个线程都有自己的堆栈内存
,在那里它存储自己的原始文本和对象引用
如果是这样,那么如果volatile
变量是对象引用而不是原语文本,会发生什么情况?我猜所有对象都存储在堆空间中,而不是堆栈内存中
第二,你能用一个例子详细解释一下volatile
关键字是如何工作的,以及我们应该在什么时候使用它吗
首先,Wikipedia和许多博客都说,所有易失性变量都存储在线程本地内存中,而不是所有线程共享的主内存中
这是不正确的。易失性字段是实例或类(静态)变量,存储在堆中
它们可能是指特定于单个处理器/核心的缓存。。。但这是硬件特有的东西。但这绝对不是“线程本地”。这个词的意思完全不同
如果是这样,那么如果volatile变量是一个对象引用而不是一个原始文本,会发生什么呢
没什么特别的。你的假设是错误的。易失性变量不存储在堆栈上
我知道每个线程都有自己的堆栈内存,它在其中存储自己的原始文本和对象引用
线程堆栈上存储的内容是:
- 方法的局部变量
- 方法的参数
- 方法的返回地址等,以便CPU知道调用返回时去哪里,以及(可能)
- JIT编译器处理的本地对象的状态不需要存储在堆中
方法的基本文本通常嵌入到代码本身中。字符串文本也在别处。(当这些文本被分配给局部变量时,它们将被保存在堆栈上…)
第二,你能用一个例子详细解释一下volatile关键字是如何工作的,以及我们应该在什么时候使用它吗
检查评论和相关问题。。。或谷歌“java易失性示例”。解释是多余的。您在哪里读到易失性变量存储在线程本地内存中?我在Wikipedia条目中没有看到这样的断言。“Wikipedia和许多博客说,所有易失性变量都存储在线程本地内存中,而不是所有线程共享的主内存中!”。请提供带有链接的引文。这听起来不对。而且是比维基百科更好的阅读volatile的地方我想我犯了一个很大的错误,我不得不说易失性变量存储在主内存中,而不是本文中所说的线程本地内存:我的同位语@Stephen C:这里有一个例子是关于线程本地内存的。现在,线程本地内存和进程缓存内存有什么区别+1表示ur ans。但是,在“线程堆栈上存储的内容是:”中,您没有提到在方法内部创建的对象的参考值。这是否意味着在方法中创建的对象将存储在堆栈itshelf中?不在堆中?在方法中创建的对象的引用不需要特别提及。它们可能存储在局部变量中(在堆栈上…已经讨论过),也可能存储在类变量、实例变量或数组中(在堆中)。我的最后一点是指一些JIT编译器在启用“转义分析”时可能执行的特定优化。在这种情况下,整个对象存储在堆栈内存中。如果JIT编译器可以推断出有问题的对象无法从当前方法“转义”,则可以执行此优化。