Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentHashMap类似于CopyOnWriteArrayList吗_Java - Fatal编程技术网

Java ConcurrentHashMap类似于CopyOnWriteArrayList吗

Java ConcurrentHashMap类似于CopyOnWriteArrayList吗,java,Java,我经常使用CopyOnWriteArrayList。尤其是当 线程执行大量的读操作 线程执行一些写操作 但是,我将在以下情况下使用Collections.synchronizedList() 线程执行一些读取操作 线程执行大量的写操作 这是因为根据 ArrayList的一种线程安全变体,其中包含所有变异操作 (添加、设置等)通过创建 底层数组 这通常太贵了 谈到ConcurrentHashMap,我想知道在选择ConcurrentHashMap而不是Collections.synchro

我经常使用CopyOnWriteArrayList。尤其是当

  • 线程执行大量的读操作
  • 线程执行一些写操作
但是,我将在以下情况下使用
Collections.synchronizedList()

  • 线程执行一些读取操作
  • 线程执行大量的写操作
这是因为根据

ArrayList的一种线程安全变体,其中包含所有变异操作 (添加、设置等)通过创建 底层数组

这通常太贵了

谈到
ConcurrentHashMap
,我想知道在选择
ConcurrentHashMap
而不是
Collections.synchronizedMap()
时是否仍能应用相同的逻辑


每次执行写操作时,
ConcurrentHashMap
是否都会对底层数据结构进行新的复制?如果写操作比读操作多,那么synchronizedMap的性能会比Collections差吗?

ConcurrentHashMap
几乎总是正确的选择,因为它比它的对应项具有更好的性能和更有用的API(您可以避免
检查,然后设置
线程问题)。
它使用锁剥离实现更细粒度的访问,并且不复制映射。

只有应用程序不应使用
ConcurrentHashMap
时,才需要为独占访问锁定映射


ConcurrentHashMap
是一个分段映射,分段数基于并发级别。当您写入一个段时,它会被锁定,直到写入完成。

当写入
ConcurrentHashMap
时。它只在内部锁定要写入的映射部分。因此,通过这种行为,我们可以清楚地看到,它不会创建新副本,而是在同一副本中进行更改。

因此,当我们尝试在
ConcurrentHashMap
中写入时,这意味着我们尝试在任何段中写入,然后它只锁定该段并只更新该段。因此,简单地说,它从来不会创建任何新的副本。因此,您的问题的答案是否定的。

我发现的主要区别是ConcurrentHashMap中的自定义“并发级别”。 我们可以询问JVM划分映射需要多少块(段)。这些锁将被创建。
CopyOnWriteArrayList使用简单的过程创建克隆并更新它。(稍后JVM会将其与原始arraylist合并。)

Ya。我知道。但这还不能解决我的问题。每次我执行写操作时,ConcurrentHashMap是否都会生成底层数据结构的新副本?首先,如果性能被记录为比对应的性能最好,那么为什么您会关心它会做什么?不,它不复制。它使用锁剥离来修改基础映射的部分,因为CopyOnWriteArrayList的性能比其对应集合差。当写入操作多于读取操作时,synchronizedList。因此,我关心ConcurrentHashMap中是否也会出现这种行为。
CopyOnWriteArrayList
是最好的选择,因为您所做的主要访问是遍历列表。否则它不是最好的选择。另外,
ConcurrentHashMap
Bloch
Goetz
推荐为性能最佳。我会使用同步集合,因为您通常只希望有一个线程使用它,但您需要线程安全性以防万一。我将使用并发集合,在这些集合中,线程之间有时会发生争用。