挥发性关键字&线程本地内存

时间:2013-01-16 03:35:51

标签: java thread-safety jvm heap volatile

我很难理解Java中volatile关键字的用法。我在互联网上看了很多文章,但我仍然无处可去。我想问一下我脑子里有很多问题:

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

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

其次,您能否详细解释一下volatile关键字如何工作以及何时应该使用它的示例?

1 个答案:

答案 0 :(得分:10)

  

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

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

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

  

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

没什么特别的。你的假设是不正确的。易失性变量不存储在堆栈中。

  

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

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

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

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

  

其次,请您详细解释一下volatile关键字的工作原理以及我们何时应该使用它的详细信息?

检查评论和相关问题......或Google“java易变例”。解释是多余的。