Есть ли эквивалент java.util.concurrent для WeakHashMap? - PullRequest
44 голосов
/ 13 февраля 2010

Может ли следующий фрагмент кода быть переписан без использования Collections.synchronizedMap(), сохраняя при этом правильность при параллелизме?

Collections.synchronizedMap(new WeakHashMap<Class, Object>());

т.е. что-то из java.util.concurrent можно использовать вместо этого? Обратите внимание, что просто заменить на

new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));

очевидно, не будет работать

Ответы [ 6 ]

36 голосов
/ 13 февраля 2010
Класс

Guava * CacheBuilder позволяет легко это сделать.

CacheBuilder.newBuilder().weakKeys().build()

Обратите внимание, что это меняет семантику равенства ключей на == вместо .equals(), что не имеет значения в вашем случае использования Class экземпляров, но является потенциальной ошибкой.

19 голосов
/ 13 февраля 2010

Я не верю, что есть. На самом деле Javadoc предлагает использовать Collections.synchronizedMap ()

"Как и большинство классов коллекций, этот класс не синхронизирован. Синхронизированный WeakHashMap может быть создан с использованием метода Collections.synchronizedMap."

1 голос
/ 13 октября 2017

Cafeine - популярный конкурент кеша гуавы.

- keys automatically wrapped in weak references
- values automatically wrapped in weak or soft references

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

LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
 .weakKeys()
 .weakValues()
 .build(key -> createExpensiveGraph(key));
0 голосов
/ 04 апреля 2018

Если вы используете Java 7 и выше, этот вариант использования решается поточно-ориентированным способом с помощью ClassValue https://docs.oracle.com/javase/7/docs/api/java/lang/ClassValue.html Если вам требуется использование remove, тщательно продумайте параллелизм и прочитайте Документ тщательно.

Если вы используете Java 6 или ниже. Нет, вам нужно синхронизировать WeakHashMap.

0 голосов
/ 17 февраля 2017

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

Как упомянуто выше, документация для WeakHashMap на https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html специально гласит:

"Синхронизированный WeakHashMap может быть создан с использованием Метод Collections.synchronizedMap "

Что подразумевает для меня, что этот метод должен работать в тандеме с поведением сборщика мусора (если документация не содержит ошибок!)

0 голосов
/ 05 марта 2012

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

...