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

挥发性HashMap与ConcurrentHashMap

贺博厚
2023-03-14
问题内容

我有一个缓存类,其中包含一个volatile HashMap<T>存储缓存项。

我很好奇更改volatile HashMap为会带来什么后果ConcurrentHashMap

我会提高性能吗?此缓存是只读缓存。

最佳选择是什么?只是HashMap?缓存将按一定间隔进行填充。


问题答案:

首先,您似乎不了解volatile关键字的作用。它确保如果声明的变量保留的
引用值volatile发生更改,则其他线程将看到它,而不是拥有缓存的副本。它与访问线程安全无关。HashMap

鉴于此,并且您说的HashMap是只读事实,您当然不需要使用任何提供线程安全的东西,包括ConcurrentHashMap

编辑添加: 您现在的最后一个编辑说“正在按一定间隔填充缓存”

那不是只读的,对吗?

如果在编写(更新现有的HashMap) 要让线程读取它 则应使用ConcurrentHashMap,是。

如果要填充一个全新HashMap变量,然后将其分配给现有变量,则可以使用volatile



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

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

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

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

  • HashMap本质上具有O(1)性能,而开关状态可以具有O(1)或O(log(n)),具体取决于编译器是否使用表开关或查找开关。 可以理解,如果switch语句是这样写的, 然后,它将使用一个表开关,显然比标准HashMap具有性能优势。但是如果switch语句是稀疏的呢?这是我要比较的两个例子: . 什么会提供更多的吞吐量,查找开关还是HashMap?HashMap的开销是否会在早期给查找开关带

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