Java имеет структуру данных “LinkedConcurrentHashMap”?

Столкнулся с той же проблемой. И позже вычисленный каждое Изображение становится repo. И это repo имело бы несколько версий для Вашего приложения. Следовательно, в Вашем случае ниже должен работать.

docker push quay.io/kapilqdocker/mcd
49
задан mmcdole 7 September 2009 в 17:44
поделиться

7 ответов

Есть несколько различных подходов к этой проблеме. Вы можете использовать:

Collections.synchronizedMap(new LinkedHashMap());

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

synchronized(map) {
    for (Object obj: map) {
        // Do work here
    }
}

Использование

new ConcurrentHashMap();

, вероятно, будет лучшим выбором, поскольку вам не нужно блокировать коллекцию для итерации по ней.

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

14
ответ дан 7 November 2019 в 11:51
поделиться

Вы можете обернуть карту в Collections.synchronizedMap, чтобы получить синхронизированную хэш-карту, которая поддерживает порядок вставки. Это не так эффективно, как ConcurrentHashMap (и не реализует дополнительные методы интерфейса ConcurrentMap), но дает вам (в некоторой степени) поточно-ориентированное поведение.

Даже могущественные Коллекции Google, похоже, не решили эту проблему конкретной проблемы пока нет. Однако есть один проект , который пытается решить эту проблему.

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

29
ответ дан 7 November 2019 в 11:51
поделиться

Поскольку ConcurrentHashMap предлагает несколько важных дополнительных методов, которых нет в интерфейсе Map, простая упаковка LinkedHashMap с synchronizedMap не даст вам той же функциональности , в частности, они выиграли »

3
ответ дан 7 November 2019 в 11:51
поделиться

Collections.synchronizedMap (new LinkedHashMap ())

4
ответ дан 7 November 2019 в 11:51
поделиться

Ответ практически отрицательный, нет ничего эквивалентного сортируемому ConcurrentHashMap (например, LinkedHashMap). Как указывали другие люди, вы можете обернуть свою коллекцию с помощью Collections.synchronizedMap (-yourmap-), однако это не даст вам такого же уровня мелкозернистой блокировки. Он просто блокирует всю карту при каждой операции.

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

0
ответ дан 7 November 2019 в 11:51
поделиться

Есть одна реализация , доступная под кодом Google. Цитата с их сайта:

Высокопроизводительная версия java.util.LinkedHashMap для использования в качестве программного кэша.

Дизайн

  • Одновременный список ссылок проходит через ConcurrentHashMap для обеспечения порядка выселения.
  • Поддерживает политику упорядоченного выселения (FIFO, LRU и Second Chance) и доступ к ней.
8
ответ дан 7 November 2019 в 11:51
поделиться

Вы можете использовать ConcurrentSkipListMap, доступный только в Java SE/EE 6 или более поздней версии. В этом случае ключи сортируются в соответствии с их естественным порядком. Вам необходимо иметь компаратор или сделать ключи сравниваемыми объектами. Чтобы имитировать поведение связанной хэш-карты (порядок итераций - это порядок добавления записей во времени), я реализовал свои ключевые объекты так, чтобы они всегда сравнивались, чтобы быть больше, чем данный другой объект, если только он не равен (что бы это ни было для вашего объекта). Обернутой синхронизированной связанной хэш-карты было недостаточно, потому что, как сказано в статье http://www.ibm.com/developerworks/java/library/j-jtp07233.html: "Обертки синхронизированных коллекций, synchronizedMap и synchronizedList, иногда называют условно потокобезопасными - все отдельные операции потокобезопасны, но последовательности операций, где поток управления зависит от результатов предыдущих операций, могут быть подвержены гонкам данных". Первый фрагмент в Листинге 1 демонстрирует распространенную идиому put-if-absent -- если запись еще не существует в Map, добавьте ее. К сожалению, в том виде, в котором он написан, существует возможность для другого потока вставить значение с тем же ключом между возвращением метода containsKey() и вызовом метода put(). Если вы хотите обеспечить вставку ровно один раз, вам нужно обернуть пару утверждений синхронизированным блоком, который синхронизируется на Map m."

Так что помогает только ConcurrentSkipListMap, который в 3-5 раз медленнее, чем обычный ConcurrentHashMap.

7
ответ дан 7 November 2019 в 11:51
поделиться
Другие вопросы по тегам:

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