Volatile Keyword amp; the thread local memory(Volatile关键字线程本地内存)
问题描述
我对Java中volatile
关键字的用法感到困惑。我在网上看了很多文章,但还是一无所获。我脑子里有很多问题想问:
首先,Wikipedia和许多博客都说,所有volatile
变量都存储在线程本地内存中,而不是所有线程共享的主内存中!我有点困惑,他们是指stack memory
吗?我知道每个线程都有自己的stack memory
,它在其中存储自己的基元文字和对象引用。
如果是,那么如果volatile
变量是对象引用而不是原始文字会发生什么?我猜所有对象都存储在堆空间中,而不是堆栈内存中。
第二,能不能请您举例详细说明volatile
关键字是如何工作的,我们应该在什么时候使用它?
推荐答案
首先,维基百科和许多博客都说,所有易失性变量都存储在线程本地内存中,而不是所有线程共享的主内存中。
这是不正确的。易失性字段是实例或类(静电)变量,存储在堆中。
它们可能指的是特定于单个处理器/内核的高速缓存.但这是特定于硬件的事情。但这绝对不是线程本地的。这个术语的意思完全不同。
如果是,那么如果易失性变量是对象引用而不是基元文本,会发生什么情况?
没什么特别的。您的假设不正确。
易失性变量不存储在堆栈中。实际上,如果您尝试将volatile
关键字用于局部变量,将会出现编译错误。(这没有任何意义。堆栈上的变量只对一个线程可见。易失性语义是关于由不同线程共享的变量。)
我知道每个线程都有自己的堆栈内存,用于存储自己的基元文字和amp;对象引用。
线程堆栈上存储的内容是:
- 方法的局部变量,
- 方法的参数,
- 方法的返回地址等,以便CPU知道调用返回时的去向,并且(可能)
- JIT编译器计算出的本地对象的状态不需要存储在堆中。
方法的原语文字通常嵌入到代码本身中。字符串文字也在其他地方。(将这些文字赋给局部变量时,它们将保留在堆栈上.)
查看评论和相关问题.或Google";java易失性示例。解释将是多余的。第二,能不能请您用一个例子详细解释一下Volatile关键字是如何工作的,我们应该在什么时候使用它?
这篇关于Volatile关键字&线程本地内存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Volatile关键字&线程本地内存
基础教程推荐
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01