易失性关键字和线程本地内存

ayo*_*ntu 6 java heap jvm volatile thread-safety

我很难理解volatileJava中关键字的用法.我在互联网上看了很多文章,但我仍然无处可去.我想问的是,我想问的问题有很多:

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

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

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

Ste*_*n C 10

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

那是不对的.易失性字段是实例或类(静态)变量,存储在堆中.

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

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

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

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

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

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

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

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

查看评论和相关问题...或Google"java volatile example".解释是多余的.