我打算实现一些需要同步数据结构的代码。我想出了HashTable
和Collections.synchronized(HashMap)
。我不需要ConcurrentHashMap
这个。我想知道这两个中哪个更好。
PS:我会调用这个对象的很多吸气剂,他们不会同时出现。所以他们的并发问题也没有问题。
我打算实现一些需要同步数据结构的代码。我想出了HashTable
和Collections.synchronized(HashMap)
。我不需要ConcurrentHashMap
这个。我想知道这两个中哪个更好。
PS:我会调用这个对象的很多吸气剂,他们不会同时出现。所以他们的并发问题也没有问题。
ConcurrentHashMap
更具可扩展性:http ://www.javamex.com/tutorials/concurrenthashmap_scalability.shtml
HashTable
并Collections.synchronized(HashMap)
提供相同的性能,但它们是有条件的线程安全的(即它们不是完全线程安全的)
如果有很多读操作,我建议用读写锁包装它:
public class MyHashMap<K, V> extends HashMap<K, V> {
private final ReadWriteLock lock = new ReentrantReadWriteLock();
@Override
public V put(K key, V value) {
final Lock w = lock.writeLock();
w.lock();
try {
return super.put(key, value);
} finally {
w.unlock();
}
}
@Override
public V get(Object key) {
final Lock r = lock.readLock();
r.lock();
try {
return super.get(key);
} finally {
r.unlock();
}
}
.... // the same approach distinguishing read and write operations
}
更新:
我会调用这个对象的很多吸气剂,他们不会同时出现
它不能保证您不需要同步。
除非您出于某种原因(不太可能)需要在整个地图上获得锁定,否则您应该使用ConcurrentHashMap
它提供更好的可伸缩性。
HashTable
同步包装器Collections.synchronized(HashMap)
(ConcurrentHashMap
尽管 HashTable 是线程安全的,但它并不能保证它使您的整个代码线程安全。HashTable 也存在一些性能问题。所以你应该使用 HashMap 但你必须自己管理所有线程安全。