6

我对volatileJava中关键字的用法感到困惑。我在互联网上阅读了很多文章,但仍然一无所获。我的脑海里有很多问题想问:

首先,维基百科和许多博客都说所有volatile变量都存储在线程本地内存中,而不是所有线程共享的主内存!我有点困惑,他们的意思是stack memory?我知道每个线程都有自己的stack memory存储自己的原始文字和对象引用的地方。

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

其次,您能否通过示例详细说明volatile关键字的工作原理以及我们应该何时使用它?

4

1 回答 1

11

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

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

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

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

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

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

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

存储在线程堆栈中的是:

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

方法的原始文字通常嵌入在代码本身中。字符串文字也在其他地方。(当这些文字被分配给局部变量时,它们将被保存在堆栈中......)

其次,您能否通过示例详细说明 volatile 关键字的工作原理以及我们应该何时使用它?

检查评论和相关问题......或谷歌“java volatile example”。解释将是多余的。

于 2013-01-16T03:52:41.523 回答