是用什么包装类之间的差异SynchronizedMap
上,HashMap
和ConcurrentHashMap
?
它只是能够HashMap
在迭代(ConcurrentHashMap
)的同时进行修改吗?
是用什么包装类之间的差异SynchronizedMap
上,HashMap
和ConcurrentHashMap
?
它只是能够HashMap
在迭代(ConcurrentHashMap
)的同时进行修改吗?
Answers:
同步HashMap
:
每种方法都使用对象级锁进行同步。因此,synchMap上的get和put方法获取一个锁。
锁定整个集合是性能开销。当一个线程保持该锁时,没有其他线程可以使用该集合。
ConcurrentHashMap
是在JDK 5中引入的。
在对象级别没有锁定,锁定的粒度要好得多。对于ConcurrentHashMap
,锁定可以处于哈希图存储桶级别。
较低级别的锁定的结果是您可以拥有并发的读取器和写入器,而这对于同步集合是不可能的。这导致更多的可伸缩性。
ConcurrentHashMap
ConcurrentModificationException
如果一个线程试图修改它而另一个线程对其进行迭代,则不会抛出a 。
本文是Java 7:HashMap与ConcurrentHashMap 的很好阅读。强烈推荐。
ConcurrentHashMap
的是,size()
结果可能已过时。size()
根据“ Java并发实践”一书,允许返回近似值而不是精确计数。因此,应谨慎使用此方法。
简短的答案:
这两个映射都是该Map
接口的线程安全实现。ConcurrentHashMap
在期望高并发的情况下实现更高的吞吐量。
Brian Goetz 关于背后想法的文章ConcurrentHashMap
非常好阅读。强烈推荐。
Map m = Collections.synchronizedMap(new HashMap(...));
docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
我们可以同时使用ConcurrentHashMap和syncnisedHashmap来实现线程安全。但是,如果看一下它们的体系结构,会有很多不同。
它将在对象级别上保持锁定。因此,如果您想执行诸如put / get之类的任何操作,则必须先获取锁。同时,不允许其他线程执行任何操作。因此,一次只能有一个线程对此进行操作。因此,这里的等待时间将增加。可以说,与ConcurrentHashMap进行比较时,性能相对较低。
它将在段级别上保持锁定。它具有16个段,默认情况下将并发级别保持为16。因此,一次可以在ConcurrentHashMap上运行16个线程。而且,读操作不需要锁。因此,任何数量的线程都可以对其执行get操作。
如果线程1要在段2中执行放置操作,而线程2要在段4中执行放置操作,则此处允许。意味着16个线程可以一次在ConcurrentHashMap上执行update(put / delete)操作。
这样在这里的等待时间会更少。因此,性能相对优于syncedHashmap。
两者都是HashMap的同步版本,其核心功能和内部结构有所不同。
ConcurrentHashMap由内部段组成,这些段在概念上可以视为独立的HashMap。所有这些段可以在高并发执行中被单独的线程锁定。因此,多个线程可以从ConcurrentHashMap获取/放置键值对,而不会互相阻塞/等待。这样做是为了提高吞吐量。
而
Collections.synchronizedMap(),我们获得了HashMap的同步版本,并且它以阻塞方式进行访问。这意味着,如果多个线程尝试同时访问SynchronizedMap,将允许它们一次以同步方式获取/放置键/值对。
SynchronizedMap
保持对象上的锁的方法ConcurrentHashMap
是一种“锁条”的概念,其中锁是放在内容的存储桶上的。从而提高了可伸缩性和性能。
ConcurrentHashMap和Synchronized HashMap的简单性能测试
。测试流程是put
在一个线程中调用并get
在三个线程上Map
同时调用。正如@trshiv所说,ConcurrentHashMap具有更高的吞吐量和速度,其读取操作没有锁定。结果是当操作时间结束时10^7
,ConcurrentHashMap 2x
比Synchronized HashMap快。
SynchronizedMap
并且ConcurrentHashMap
都是线程安全类,并可以在多线程应用程序中使用,它们之间的主要区别是关于他们如何实现线程安全。
SynchronizedMap
获取对整个Map实例的锁定,同时ConcurrentHashMap
将Map实例分为多个段,并在这些段上进行锁定。
Hashtable
和之间有什么区别Synchronized HashMap
?