当前位置: 首页 > 知识库问答 >
问题:

如何理解“挥发性”能见度?

呼延英奕
2023-03-14

我正在学习著名的《关于Java》一书。这本书说:“如果一个线程写入一个变量,而其他线程只读取它,那么你可以让该变量保持易失性。”我不明白为什么不需要“易失性”来确保将线程刷新变量写回内存?如果没有易失性,其他线程是否会因为本地缓存而读取脏数据

共有1个答案

居琛
2023-03-14

Java易失性关键字用于将Java变量标记为“存储在主存储器中”。更准确地说,这意味着对易失性变量的每一次读取都将从计算机的主存储器中读取,而不是从中央处理器缓存中读取,对易失性变量的每一次写入都将写入主存储器,而不仅仅是中央处理器缓存。

实际上,由于Java5,volatile关键字保证的不仅仅是向主内存写入和读取volatile变量。我将在以下几节中解释这一点。

Java volatile关键字保证了变量在线程中的变化的可见性。这听起来可能有点html" target="_blank">抽象,所以让我详细解释一下。

在多线程应用程序中,线程对非易失性变量进行操作,出于性能原因,每个线程可能会在处理变量时将变量从主存复制到CPU缓存中。如果计算机包含多个CPU,则每个线程可能在不同的CPU上运行。这意味着,每个线程可以将变量复制到不同CPU的CPU缓存中。

在这里看到更多

 类似资料:
  • 学习理解运行的程序的性能问题与学习 debug 是一样不可避免的。即使你完美、精确地理解了你的代码运行时所产生的开销,你的代码也会调用其他你几乎不能控制的或者几乎不可看透的软件系统。然而,实际上,通常性能问题和调试有点不一样,而且往往要更简单些。 假如你或你的客户认为你的一个系统或子系统运行太慢了。在你把它变快之前,你必须构建一个它为什么慢的思维模型。为了做到这个,你可以使用一个图表工具或者一个好

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

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

  • 问题内容: 在以下简单场景中: x是否需要挥发?我知道同步保证了原子性,但是我不确定可见性…是否执行锁->修改->解锁->锁保证,第二个锁之后x的值将为“新鲜”? 问题答案: 不,不是,已 同步 已在其后插入了内存屏障,因此考虑到其他线程将在同一锁上进行同步,所有线程将看到当前线程执行的更新。 就像同步的一样,易失性具有附加的内存屏障-根据CPU的不同,它是存储/加载/完全屏障,可确保一个线程的更

  • 问题内容: 可变布尔不能实现的AtomicBoolean有什么作用? 问题答案: 他们是完全不同的。考虑以下volatile整数示例: 如果两个线程同时调用该函数,则i之后可能为5,因为编译后的代码与此类似(除非你无法在上同步int): 如果变量是易失性的,则对它的每个原子访问都是同步的,但是实际上什么才算是原子访问并不总是很明显。对于一个对象,可以保证每种方法都是“原子的”。 因此,如果使用,则

  • 本文向大家介绍Redis 常见的性能问题有哪些?该如何解决?相关面试题,主要包含被问及Redis 常见的性能问题有哪些?该如何解决?时的应答技巧和注意事项,需要的朋友参考一下 主服务器写内存快照,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以主服务器最好不要写内存快照。 Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,主从库最好在同一个局域网内。