ConcurrentHashMap与同步HashMap


148

是用什么包装类之间的差异SynchronizedMap上,HashMapConcurrentHashMap

它只是能够HashMap在迭代(ConcurrentHashMap)的同时进行修改吗?

Answers:


120

同步HashMap

  1. 每种方法都使用对象级锁进行同步。因此,synchMap上的get和put方法获取一个锁。

  2. 锁定整个集合是性能开销。当一个线程保持该锁时,没有其他线程可以使用该集合。

ConcurrentHashMap 是在JDK 5中引入的。

  1. 在对象级别没有锁定,锁定的粒度要好得多。对于ConcurrentHashMap,锁定可以处于哈希图存储桶级别。

  2. 较低级别的锁定的结果是您可以拥有并发的读取器和写入器,而这对于同步集合是不可能的。这导致更多的可伸缩性。

  3. ConcurrentHashMapConcurrentModificationException如果一个线程试图修改它而另一个线程对其进行迭代,则不会抛出a 。

本文是Java 7:HashMap与ConcurrentHashMap 的很好阅读。强烈推荐。


7
那么Hashtable和之间有什么区别Synchronized HashMap
roottraveller

1
在ConcurrentHashMap和Synchronized HashMap之间,您推荐哪一种?
Blunderchips

2
值得一提ConcurrentHashMap的是,size()结果可能已过时。size()根据“ Java并发实践”一书,允许返回近似值而不是精确计数。因此,应谨慎使用此方法。
Andrii Lisun

1
@roottraveller为Hashtable和HashMap的同步stackoverflow.com/questions/8875680/...
纳伦德拉Jaggi

89

简短的答案:

这两个映射都是该Map接口的线程安全实现。ConcurrentHashMap在期望高并发的情况下实现更高的吞吐量。

Brian Goetz 关于背后想法的文章ConcurrentHashMap非常好阅读。强烈推荐。


1
那是什么 HashMap:请注意,此实现未同步,以防止意外意外访问地图: Map m = Collections.synchronizedMap(new HashMap(...)); docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
X-HuMan 2014年

5
“ Brian Goetz的文章……读得很好。” -他的《 Java Concurrency in Practice》一书更是如此。
Alex Fedulov 2015年

31

ConcurrentHashMap在不同步整个映射的情况下是线程安全的。用锁完成写操作时,读操作可能会非常快。


18

我们可以同时使用ConcurrentHashMap和syncnisedHashmap来实现线程安全。但是,如果看一下它们的体系结构,会有很多不同。

  1. 同步哈希图

它将在对象级别上保持锁定。因此,如果您想执行诸如put / get之类的任何操作,则必须先获取锁。同时,不允许其他线程执行任何操作。因此,一次只能有一个线程对此进行操作。因此,这里的等待时间将增加。可以说,与ConcurrentHashMap进行比较时,性能相对较低。

  1. 并发哈希图

它将在段级别上保持锁定。它具有16个段,默认情况下将并发级别保持为16。因此,一次可以在ConcurrentHashMap上运行16个线程。而且,读操作不需要锁。因此,任何数量的线程都可以对其执行get操作。

如果线程1要在段2中执行放置操作,而线程2要在段4中执行放置操作,则此处允许。意味着16个线程可以一次在ConcurrentHashMap上执行update(put / delete)操作。

这样在这里的等待时间会更少。因此,性能相对优于syncedHashmap。


非常好的解释非常感谢
amoljdv06 '18

11

两者都是HashMap的同步版本,其核心功能和内部结构有所不同。

ConcurrentHashMap由内部段组成,这些段在概念上可以视为独立的HashMap。所有这些段可以在高并发执行中被单独的线程锁定。因此,多个线程可以从ConcurrentHashMap获取/放置键值对,而不会互相阻塞/等待。这样做是为了提高吞吐量。

Collections.synchronizedMap(),我们获得了HashMap的同步版本,并且它以阻塞方式进行访问。这意味着,如果多个线程尝试同时访问SynchronizedMap,将允许它们一次以同步方式获取/放置键/值对。


7

ConcurrentHashMap使用称为更细粒度的锁定机制,lock stripping以允许更大程度的共享访问。因此,它提供了更好的并发性可伸缩性

同样,返回的迭代器ConcurrentHashMap弱一致性的,而不是Synchronized HashMap使用的快速失败技术


3

SynchronizedMap保持对象上的锁的方法ConcurrentHashMap是一种“锁条”的概念,其中锁是放在内容的存储桶上的。从而提高了可伸缩性和性能。


2

ConcurrentHashMap:

1)这两个映射都是Map接口的线程安全实现。

2)在期望高并发性的情况下,实现ConcurrentHashMap可以提高吞吐量。

3)对象级别没有锁定。

同步哈希图:

1)每个方法都使用对象级锁进行同步。


1

ConcurrentHashMap允许并发访问数据。整个地图分为多个部分。

读取操作即 get(Object key)即使在段级别也不同步。

但是写操作即。remove(Object key), get(Object key)在段级别获取锁定。整个映射中只有一部分被锁定,其他线程仍可以从各个段中读取值(锁定的段除外)。

另一方面,SynchronizedMap在对象级别获取锁定。无论操作(读/写)如何,所有线程都应等待当前线程。



0

根据java doc的

Hashtable和Collections.synchronizedMap(new HashMap())已同步。但是ConcurrentHashMap是“并发的”。

并发集合是线程安全的,但不受单个排除锁的约束。

在ConcurrentHashMap的特定情况下,它安全地允许任意数量的并发读取以及可调数量的并发写入。当需要阻止通过单个锁对集合的所有访问时,“同步”类会很有用,但代价是可伸缩性较差。

在期望多个线程访问一个公共集合的其他情况下,通常最好使用“并发”版本。当未共享的集合或仅在持有其他锁时才可访问的集合时,不同步的集合是更可取的。


0

SynchronizedMap并且ConcurrentHashMap都是线程安全类,并可以在多线程应用程序中使用,它们之间的主要区别是关于他们如何实现线程安全。

SynchronizedMap获取对整个Map实例的锁定,同时ConcurrentHashMap将Map实例分为多个段,并在这些段上进行锁定。

在此处输入图片说明

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.