2012-04-05 3 views
0

Я собирался реализовать некоторый код, для которого требуется синхронизированная структура данных. Я придумал HashTable и Collections.synchronized(HashMap). Для этого мне не понадобится ConcurrentHashMap. Мне было интересно, какой из двух будет лучше.Эффективность HashTable и Collections.synchronized (HashMap)

PS: Я буду называть много геттера этого объекта, и они не будут в одно и то же время. Таким образом, они также не проблема с проблемой параллелизма.

ответ

2

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 

} 

UPDATE:

Я буду называть много добытчика этого объекта, и они не были бы в то же время

Это не гарантирует, что вам не нужно синхронизировать.

+0

Я не ищу ничего, что потокобезопасно, потому что к ним всегда будет обращаться только администратор. ConcurrentHashMap громоздкий по сравнению с HashMap и HashTable. Я не точный размер, но это было похоже на пустые concurrenthashmap - 170 и хеш-таблицы - 150 – nandu

+0

Вы получаете доступ к карте в веб-приложении? Если к нему обращаются из разных потоков (что относится к любой стороне сервера), тогда он должен быть потокобезопасным, даже если к нему обращается только один пользователь. –

+0

Функциональность его использования немного сложна для объяснения. Но я уверен, что с ним не будет никаких проблем с потоком. – nandu

0

Если по какой-либо причине (маловероятно) вам необходимо приобрести замок на всей карте, вы должны пойти за ConcurrentHashMap, который дает гораздо лучшую масштабируемость.

HashTable и синхронизированная обертка (Collections.synchronized(HashMap)) используют один замок, тогда как ConcurrentHashMap разбиений карты в 16 сегментов по умолчанию, каждый из которых имеет свой собственный замок, который дает гораздо лучше одновременный доступ.

+0

Да, я заблокирую эту структуру, как только я ее установлю – nandu

0

Несмотря на то, что HashTable является потокобезопасным, но он не гарантирует, что он сделает весь ваш код потоком-safe.HashTable также имеет некоторые проблемы с производительностью. Поэтому вы должны использовать HashMap, но вам нужно управлять всеми средствами защиты потоков.

Смежные вопросы