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关键字&线程本地内存
- 转换 ldap 日期 2022-01-01
- 未找到/usr/local/lib 中的库 2022-01-01
- Eclipse 的最佳 XML 编辑器 2022-01-01
- 获取数字的最后一位 2022-01-01
- 如何指定 CORS 的响应标头? 2022-01-01
- 在 Java 中,如何将 String 转换为 char 或将 char 转换 2022-01-01
- java.lang.IllegalStateException:Bean 名称“类别"的 BindingResult 和普通目标对象都不能用作请求属性 2022-01-01
- 如何使 JFrame 背景和 JPanel 透明且仅显示图像 2022-01-01
- GC_FOR_ALLOC 是否更“严重"?在调查内存使用情况时? 2022-01-01
- 将 Java Swing 桌面应用程序国际化的最佳实践是什么? 2022-01-01