2013-08-14 2 views
2

Когда я делаю Collections.synchronizedMap (someHashMap), все ли доступ к карте синхронизированы? Или только операции записи (put) синхронизированы? Как насчет чтения двух потоков с карты? Будет ли она синхронизирована? Doesnt кажется необходимым Как abotu, если один поток выполняет put(), а другой делает get()?Использует ли метод synchronizedMap в коллекциях операции чтения и записи

+0

Потому что 'Collections.synchronizedMap' является настолько базовым, что почти непригодно. Существует ConcurrentHashMap для более серьезного одновременного использования. –

ответ

3

Посмотрите на исходный код SynchronizedMap, который обертывает ваш Map.

... 
public V get(Object key) { 
    synchronized (mutex) {return m.get(key);} 
} 

public V put(K key, V value) { 
    synchronized (mutex) {return m.put(key, value);} 
} 
public V remove(Object key) { 
    synchronized (mutex) {return m.remove(key);} 
} 
... // more methods synchronized in the same way 

От

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { 
    return new SynchronizedMap<>(m); 
} 

Так что, да, все доступы синхронизированы.

+0

Но, к сожалению, чтение и запись синхронизируются во внутреннем мьютексе, что делает невозможным повторение итерации внешнего кода при выполнении блокировки. EDIT: Sotirios и Affe верны, и мои комментарии следует игнорировать. – dnault

+1

Вот что говорит javadoc: 'Обязательно, чтобы пользователь вручную синхронизировал на возвращенной карте при итерации по любому из своих видов коллекции: ...' –

+2

мьютекс действительно просто «это», то, как он написан, просто идиоматическое. Синхронизация карты для итерации выполняется правильно. – Affe

1

Да, он синхронизирует все операции. Он не использует многопользовательский подход с одним писателем - это так же просто, как синхронизация всего доступа через один монитор.

0

Оба чтения и записи синхронизированы, что необходимо для обеспечения видимости.

0

Все вызовы вызовов в коллекции синхронизированы. Только одному потоку будет разрешено читать/изменять коллекцию за раз.

Синхронизированные * методы из Коллекций не предназначены для лучшей версии/реализации потоковой безопасности. Они просто должны быть удобными.

Синхронизация является сложной проблемой и обычно требует разных подходов синхронизации на основе вашего конкретного сценария. Если вам требуются другие типы безопасности потоков, существует множество других доступных для потолка коллекций. Вы также можете сами написать логику синхронизации.

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