当前位置: 首页 > 面试题库 >

Java易失性和缓存一致性

曹成双
2023-03-14
问题内容

如果高速缓存一致性是在硬件级别实现的,为什么我们需要可变的?任何内核/处理器都应该获得最新值吗?

还是完全解决了另一个问题?


问题答案:

高速缓存一致性可以在处理器级别实现,但是,除非处理器内存模型保证顺序一致性(在大多数现代体系结构中不是这种情况),否则只有在需要时才会获得高速缓存一致性。

这就是volatile的含义:它要求JVM生成相关的机器指令,这些指令将要求处理器将其缓存与主内存同步。



 类似资料:
  • 如果缓存一致性是在硬件级别实现的,为什么我们需要volatile?任何核心/处理器都应该获得最新的值? 还是它完全在处理一个不同的问题?

  • 在此处的oracle Java文档中,说明如下: 原子操作不能交错,因此可以在不担心线程干扰的情况下使用它们。然而,这并不能消除同步原子操作的所有需要,因为内存一致性错误仍然是可能的。使用易失性变量可以降低内存一致性错误的风险,因为对易失性变量的任何写入都会与该变量的后续读取建立“发生在之前”的关系。这意味着对易失性变量的更改对其他线程总是可见的。此外,这还意味着当线程读取volatile变量时,

  • 我正在看java jpoint会议的视频。 我对以下Alexey Shipilev报告幻灯片有疑问: 请原谅幻灯片上的非英语。实际上作者说变量集是不可能的 附注。 如果我理解Alexey符号正确,它尊重以下代码:

  • 我正在评估Apache Ignite,以检查它是否符合我们公司的需要。到目前为止还好。现在我正试图了解near cache特性在一致性方面是如何工作的。 我的问题是:除了这个文档之外,还有其他文档解释它是如何工作的吗?特别是,我想知道对任何其他实例的任何后续读请求(在写请求之后)是否会获得更新的数据(没有最终的一致性)。 谢了!

  • 现在的处理器都是多核处理器,并且每个核都带有多个缓存(指令缓存和数据缓存,见下图)。为什么需要缓存呢,这是因为CPU访问内存的速度比较慢,所以在CPU和内存之间加了个缓存以提高访问速度。既然每个核都有缓存,那么假设两个核或者多个核同时访问同一个变量时这些缓存是如何进行同步的呢(缓存细分为一个个缓存行),这就有了MESI协议。 MESI中的状态 CPU中每个缓存行(caceh line)使用4种状态

  • 现在的处理器都是多核处理器,并且每个核都带有多个缓存(指令缓存和数据缓存,见下图)。为什么需要缓存呢,这是因为CPU访问内存的速度比较慢,所以在CPU和内存之间加了个缓存以提高访问速度。既然每个核都有缓存,那么假设两个核或者多个核同时访问同一个变量时这些缓存是如何进行同步的呢(缓存细分为一个个缓存行),这就有了MESI协议。 MESI中的状态 CPU中每个缓存行(caceh line)使用4种状态