Volatile关键字&线程本地内存

2022-02-25 00:00:00 jvm thread-safety java heap-memory volatile

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

首先,Wikipedia和许多博客都说,所有volatile变量都存储在线程本地内存中,而不是所有线程共享的主内存中!我有点困惑,他们是指stack memory吗?我知道每个线程都有自己的stack memory,它在其中存储自己的基元文字和对象引用。

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

第二,能不能请您举例详细说明volatile关键字是如何工作的,我们应该在什么时候使用它?


解决方案

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

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

它们可能指的是特定于单个处理器/内核的高速缓存.但这是特定于硬件的事情。但这绝对不是线程本地的。这个术语的意思完全不同。

如果是,那么如果易失性变量是对象引用而不是基元文本,会发生什么情况?

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

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

我知道每个线程都有自己的堆栈内存,用于存储自己的基元文字和amp;对象引用。

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

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

方法的原语文字通常嵌入到代码本身中。字符串文字也在其他地方。(将这些文字赋给局部变量时,它们将保留在堆栈上.)

第二,能不能请您用一个例子详细解释一下Volatile关键字是如何工作的,我们应该在什么时候使用它?

查看评论和相关问题.或Google";java易失性示例。解释将是多余的。

相关文章