我有一个缓存类,其中包含一个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: 在这