[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]