Volatile关键字&线程本地内存
我对Java中volatile
关键字的用法感到困惑。我在网上看了很多文章,但还是一无所获。我脑子里有很多问题想问:
首先,Wikipedia和许多博客都说,所有volatile
变量都存储在线程本地内存中,而不是所有线程共享的主内存中!我有点困惑,他们是指stack memory
吗?我知道每个线程都有自己的stack memory
,它在其中存储自己的基元文字和对象引用。
volatile
变量是对象引用而不是原始文字会发生什么?我猜所有对象都存储在堆空间中,而不是堆栈内存中。
第二,能不能请您举例详细说明volatile
关键字是如何工作的,我们应该在什么时候使用它?
解决方案
首先,维基百科和许多博客都说,所有易失性变量都存储在线程本地内存中,而不是所有线程共享的主内存中。
这是不正确的。易失性字段是实例或类(静电)变量,存储在堆中。
它们可能指的是特定于单个处理器/内核的高速缓存.但这是特定于硬件的事情。但这绝对不是线程本地的。这个术语的意思完全不同。
如果是,那么如果易失性变量是对象引用而不是基元文本,会发生什么情况?
没什么特别的。您的假设不正确。
易失性变量不存储在堆栈中。实际上,如果您尝试将volatile
关键字用于局部变量,将会出现编译错误。(这没有任何意义。堆栈上的变量只对一个线程可见。易失性语义是关于由不同线程共享的变量。)
我知道每个线程都有自己的堆栈内存,用于存储自己的基元文字和amp;对象引用。
线程堆栈上存储的内容是:
- 方法的局部变量,
- 方法的参数,
- 方法的返回地址等,以便CPU知道调用返回时的去向,并且(可能)
- JIT编译器计算出的本地对象的状态不需要存储在堆中。
方法的原语文字通常嵌入到代码本身中。字符串文字也在其他地方。(将这些文字赋给局部变量时,它们将保留在堆栈上.)
查看评论和相关问题.或Google";java易失性示例。解释将是多余的。第二,能不能请您用一个例子详细解释一下Volatile关键字是如何工作的,我们应该在什么时候使用它?
相关文章