0

我打算实现一些需要同步数据结构的代码。我想出了HashTableCollections.synchronized(HashMap)。我不需要ConcurrentHashMap这个。我想知道这两个中哪个更好。

PS:我会调用这个对象的很多吸气剂,他们不会同时出现。所以他们的并发问题也没有问题。

4

3 回答 3

2

ConcurrentHashMap更具可扩展性:http ://www.javamex.com/tutorials/concurrenthashmap_scalability.shtml

HashTableCollections.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

}

更新:

我会调用这个对象的很多吸气剂,他们不会同时出现

它不能保证您不需要同步。

于 2012-04-05T16:12:21.977 回答
0

除非您出于某种原因(不太可能)需要在整个地图上获得锁定,否则您应该使用ConcurrentHashMap它提供更好的可伸缩性。

HashTable同步包装器Collections.synchronized(HashMap)ConcurrentHashMap

于 2012-04-05T16:13:35.117 回答
0

尽管 HashTable 是线程安全的,但它并不能保证它使您的整个代码线程安全。HashTable 也存在一些性能问题。所以你应该使用 HashMap 但你必须自己管理所有线程安全。

于 2012-04-05T16:29:42.293 回答