【发布时间】:2018-09-21 19:14:39
【问题描述】:
如果我有:
final Myobject o = new Myobject();
这是存储在堆中的。 出于性能原因,这也存储在使用它的本地处理器缓存中,我的问题是:多线程是否存在可见性问题?
2 种不同的场景:
1) 如果对象的整个结构都存储在缓存中,而其他线程对其进行了修改,是的,这应该是可见性问题。
2) 如果只有引用存储在缓存中,那么即使另一个线程修改它也不会有问题,因为每个线程都会从主内存/堆中读取。
我的推理对吗?
作为下一个问题,我想知道 java 在缓存中存储了什么,如果对象的整个结构从堆复制到缓存或仅引用,我在哪里可以找到这些信息?
谢谢:)
【问题讨论】:
-
你说的是 CPU 缓存(L1、L2 等)吗?
-
"多线程是否存在可见性问题?"是的。
-
Java 内存模型定义了从多个线程访问数据存在哪些保证。如果您使用合适的锁定结构(等),那么这些问题没有实际意义。
-
是的,如果我是对的,我认为它们是唯一的缓存
-
另外值得注意的是,堆和缓存并不是不同的东西。堆是一种抽象,构建在虚拟内存中。这本身就是物理内存之上的抽象,其中的一部分在不同的时间被复制到不同的缓存中。
标签: java multithreading concurrency shared-memory heap-memory