Hashmap и хеш-таблица в многопоточной среде

Можно использовать Ubuntu Один Индикатор . Это работает как индикатор Dropbox (или значок панели задач), и можно использовать его, чтобы разъединиться и снова соединиться с Ubuntu Один двумя щелчками (откройте меню, нажмите объект), или использование HUD. Разъединение уничтожит демона, и соединяющийся снова породит его.

enter image description here

можно установить его от этого PPA:

sudo apt-add-repository ppa:rye/ubuntuone-extras
sudo apt-get update
sudo apt-get install indicator-ubuntuone

будет добавлено к Вашим программам автозапуска, поэтому если Вы не захотите, чтобы это запустилось, то необходимо будет удалить его оттуда.

Для выполнения его:

/usr/lib/indicator-ubuntuone/indicator-ubuntuone

, Если Вы планируете использовать его много, Вы должны, вероятно, символьная ссылка это к мусорному ведру (для легкого доступа командной строки) или создавать .desktop файл для него (для Тире/Доступа к меню)

6
задан 1 September 2009 в 10:53
поделиться

5 ответов

Также обратите внимание, что Hashtable и Collections.synchronizedMap безопасны только для отдельных операций. Любые операции с несколькими ключами или «проверка и действие», которые должны быть атомарными, будут не таковыми, и потребуется дополнительная блокировка на стороне клиента.

Например, вы не можете написать ни один из следующих методов без дополнительная блокировка:

  • поменять местами значения на двух разных ключах: swapValues ​​(Map, Object k1, Object k2)

  • добавить параметр к значению с ключом: appendToValue (Map, Object k1, String суффикс)

И да, все это покрыто JCIP: -)

3
ответ дан 8 December 2019 в 13:47
поделиться

Посмотрите на ConcurrentHashMap для потоковообезопасных карт.

Они предлагают все функции HashTable с производительностью, очень близкой к HashMap.

Производительность достигается за счет использования блокировки всей карты, коллекция по умолчанию поддерживает список из 16 блокировок, каждая из которых используется для блокировки одного сегмента карты. Вы даже можете настроить количество сегментов :) Настройка этого может улучшить производительность в зависимости от ваших данных.

Я не могу рекомендовать достаточное количество Java Concurrency на практике, Брайан Гетц http://jcip.net/

Я все еще узнаю что-то новое каждый раз, когда читаю это.

12
ответ дан 8 December 2019 в 13:47
поделиться

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

HashMap не синхронизирован, поэтому он быстрее, но у вас могут возникнуть проблемы в многопоточной среде.

2
ответ дан 8 December 2019 в 13:47
поделиться

Да, все методы выполняются атомарно, а метод values ​​() - нет (см. docs ).

Пол был быстрее меня, рекомендуя вам java.util .concurrent, который дает вам очень точный контроль и структуры данных для многопоточных сред.

0
ответ дан 8 December 2019 в 13:47
поделиться

Хеш-таблицы синхронизированы, но это старая реализация, которая, можно сказать, устарела. Кроме того, они не допускают нулевые ключи (может быть, и не нулевые значения? Не уверен).

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

Аналогичный уровень синхронизации можно получить для HashMaps, вызвав:

Map m = Collections.synchronizedMap(new HashMap());

, который обертывает карту в вызовах синхронизированных методов. Но у этого есть те же недостатки параллелизма, что и у Hashtable.

Как говорит Пол, ConcurrentHashMaps предоставляет потокобезопасные карты с дополнительными полезными методами для атомарных обновлений.

0
ответ дан 8 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: