[size=medium]
[b]区别[/b]
[list]
[*]HashTable 与 HashMap 的区别主要在于 HashTable 是同步的,而 HashMap 不是同步的。
[*]HashTable 在 get(), put(), remove() 等方法都加上了 synchronized 关键字进行同步。这样的效率确实不高。
[*]HashMap 如果想使用同步版的,可以使用 Collections.synchronizedMap(new HashMap()) 来获取同步版。具体实现也就是添加了一个 Object,然后调用 get(), put() 等方法时都先锁定这个 Object。
[/list]
[b]误区[/b]
[list]
[*]同步的不代表是线程安全的,比如下面的代码。由于这个事务是由多个操作组成的,如果一个线程在执行完判断 containKey 后另外一个线程已经插入了数据,这时再执行就要杯具了。
[/list]
[/size]
[size=medium]
不过如果是 ConcurrentHashMap 针对这种情况作了处理,它的父接口 ConcurrentMap 提供了一个 putIfAbsent 方法,这个方法也是原子操作的。
[/size]
[b]区别[/b]
[list]
[*]HashTable 与 HashMap 的区别主要在于 HashTable 是同步的,而 HashMap 不是同步的。
[*]HashTable 在 get(), put(), remove() 等方法都加上了 synchronized 关键字进行同步。这样的效率确实不高。
[*]HashMap 如果想使用同步版的,可以使用 Collections.synchronizedMap(new HashMap()) 来获取同步版。具体实现也就是添加了一个 Object,然后调用 get(), put() 等方法时都先锁定这个 Object。
[/list]
[b]误区[/b]
[list]
[*]同步的不代表是线程安全的,比如下面的代码。由于这个事务是由多个操作组成的,如果一个线程在执行完判断 containKey 后另外一个线程已经插入了数据,这时再执行就要杯具了。
[/list]
[/size]
public void operate() {
if (!map.containKey("something")) {
map.put("key", "value");
}
}
[size=medium]
不过如果是 ConcurrentHashMap 针对这种情况作了处理,它的父接口 ConcurrentMap 提供了一个 putIfAbsent 方法,这个方法也是原子操作的。
[/size]
本文对比了HashTable与HashMap之间的核心不同之处,指出HashTable是同步的而HashMap不是,并介绍了如何将HashMap转换为同步版本的方法。此外,文章还提到了在多线程环境下这两种数据结构可能存在的线程安全问题,并给出了ConcurrentHashMap作为解决方案。
1565

被折叠的 条评论
为什么被折叠?



