<分区>
我对 Java 中 volatile
关键字的用法感到困惑。我在互联网上阅读了很多文章,但仍然一无所获。我脑子里有很多问题想问:
首先,维基百科和许多博客都说所有volatile
变量都存储在所有线程共享的主内存之上的Thread-Local 内存 中!我有点困惑,它们是指 stack memory
吗?我知道每个线程都有自己的堆栈内存
,它存储自己的原始文字和对象引用。
如果是这样,那么如果 volatile
变量是一个对象引用而不是原始文字会发生什么?我想所有的对象都存储在堆空间而不是堆栈内存中。
其次,您能否使用示例详细解释 volatile
关键字的工作原理以及我们应该在什么时候使用它?
First of all, Wikipedia and many blogs say that all volatile variables are stored in a Thread-Local memory over the main memory shared by all threads.
这是不正确的。 volatile 字段是实例或类(静态)变量,存储在堆中。
它们可能指的是特定于单个处理器/内核的高速缓存……但这是特定于硬件的东西。但这绝对不是“线程本地”。该术语的含义完全不同。
If so, then what happen if the volatile variable is an object reference and not a primitive literal?
没什么特别的。您的假设不正确。
易变变量不存储在堆栈中。实际上,如果您尝试对局部变量使用 volatile
关键字,您将遇到编译错误。 (这是没有意义的。堆栈上的变量仅对一个线程可见。可变语义是关于由不同线程共享的变量。)
I know each thread has his own stack memory where it stores its own primitive literals & objects references.
线程栈中存储的是:
- 方法的局部变量,
- 方法的参数,
- 方法的返回地址等,以便 CPU 知道调用返回时去哪里,并且(可能)
- JIT 编译器认为不需要存储在堆中的本地对象的状态。
方法的原始文字通常嵌入在代码本身中。字符串文字也在别处。 (当这些文字被分配给局部变量时,它们将被保存在堆栈中......)
Second, could you please explain in details using an example how the volatile keyword works and when we are supposed to use it?
查看评论和相关问题...或谷歌“java volatile example”。解释是多余的。