2016-11-29 7 views
2

У меня есть ConcurrentHashMap<String, Object> concurrentMap;Is concurrentMap.keySet(). ToArray() потокобезопасный?

Мне нужно вернуть String [] с помощью ключей карты.

Является ли следующий код:

public String[] listKeys() { 
    return (String[]) concurrentMap.keySet().toArray(); 
    } 

поточно?

+0

Возможно, эта статья может быть интересна для вас: http://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-synchronized-in-java/ – thoeni

+0

Обратите внимание, что cast в 'String []' также неверно. – user2357112

ответ

2

Да и № Threas-сейф только нечетко определяется как как только вы расширите сферу действия.

Как правило, параллельные коллекции реализуют все свои методы способами, позволяющими параллельный доступ несколькими потоками или, если они не могут, обеспечить механизмы для последовательного сериализации таких доступов (например, синхронизации) прозрачно. Таким образом, они безопасны в том смысле, что они обеспечивают сохранение правильной внутренней структуры, а вызовы методов дают достоверные результаты.

Нечеткость начинается, если вы посмотрите на детали, например. toArray() вернет вам какой-то моментальный снимок содержимого коллекций. Нет гарантии, что к моменту возвращения метода содержимое не будет уже изменено. Таким образом, пока вызов является потокобезопасным, результат будет не выполнить обычные инварианты (например, содержимое массива может не быть таким же, как коллекции).

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

3

Хотя ConcurrentHashMap является поточно-класс, Iterator, который используется на клавишах НЕ УВЕРЕНЫ быть синхронизированы с любыми последующими HashMap изменений, после создания ...

От spec:

public Set<K> keySet() 

    Returns a Set view of the keys contained in this map...... 
    ........................... 

    The view's iterator is a "weakly consistent" iterator that will 
    never throw ConcurrentModificationException, and guarantees to 
    traverse elements as they existed upon construction of the iterator, 
    and may (but is not guaranteed to) reflect any modifications 
    subsequent to construction. 

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

  • Нет связанных вопросов^_^