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

JVM是否保证不缓存非挥发性变量?

赫连方伟
2023-03-14
问题内容

JVM是否保证不缓存非可变变量?

程序员是否可以依赖JVM始终为每个线程本地缓存非易失性变量。

或JVM可能会或可能不会这样做,因此程序员不应为此而依赖JVM。

预先感谢您的回答。


问题答案:

否。JVM不能保证“缓存”非易失性字段。JVM保证的实现是 可变字段应如何表现
。字段的缓存是非标准的(未指定),并且因JVM的实现而异。因此,您不应该真正依赖它(即使通过某种方式发现某些数据正在被线程缓存)



 类似资料:
  • 问题内容: 在下面的程序中,如果执行了此程序(例如,通过命令行),则是否可以单独确保args JVM不为null? 问题答案: 简短的回答:是的,它的长度可能为0,但不会为null。

  • 问题内容: 以下是经典文章Concurency in Practice: 当线程A写入易失性变量,随后线程B读取相同的变量时,在写入易失性变量之前A可见的所有变量的值,在读取易失性变量后B可见。 我不确定我是否真的能理解这一说法。例如,在这种情况下,所有变量的含义是什么?这是否意味着使用volatile还会对非易失性变量的使用产生副作用? 在我看来,该声明具有我无法理解的一些微妙含义。 有什么帮助

  • 问题内容: 众所周知,如果我们有一些对象引用并且此引用具有final字段,则将确保-我们将看到final字段中的所有可访问字段(至少在构造函数完成时) 范例1: 正如我在这种情况下所理解的那样,我们保证该方法总是输出,因为: 1.我列出了class 和map的完整代码是最终的; 2.如果某个线程将看到的引用,而该引用!= null,则我们保证从最终引用值可达到将是实际的。 我也认为 范例2: 在这

  • Infinispan作为hibernate二级缓存的更新方式与数据库事务的工作方式不同。我的意思是,在完全提交之前,数据库事务对其他事务不可见。根据日志记录,我观察到事务(JEE MDB)能够部分更新给定的Infinispan更新。具体来说,我的设置如下: Jboss 我似乎看到的是,如果在事务的DB提交之后启动JEE bean,并且我认为是infinispan更新(提交),那么它可以看到一些in

  • 问题内容: 它可能是实现细节,但是对于Oracle和IBM JDK而言,至少是对已编译模式进行了缓存,还是作为应用程序开发人员我们需要自己对已编译模式进行缓存? 问题答案: 我不认为结果会被缓存,并且代码或文档中也没有这种行为的证据。自己实现这样的缓存(当然)是比较琐碎的,但是我对这样的缓存很有用的用例感兴趣。 回覆。下面的注释和String.split(),有一种不同的方法,即代码采用简单的1或

  • 问题内容: 我有一个缓存类,其中包含一个存储缓存项。 我很好奇更改为会带来什么后果? 我会提高性能吗?此缓存是只读缓存。 最佳选择是什么?只是HashMap?缓存将按一定间隔进行填充。 问题答案: 首先,您似乎不了解关键字的作用。它确保如果声明的变量保留的 引用值发生更改,则其他线程将看到它,而不是拥有缓存的副本。它与访问线程安全无关。 鉴于此,并且您说的是只读事实,您当然不需要使用任何提供线程安