Existe Java.util.Concurrent equivalente para o fracohashmap?
-
20-09-2019 - |
Pergunta
A seguinte parte do código pode ser reescrita sem usar Collections.synchronizedMap()
ainda manter a correção na simultaneidade?
Collections.synchronizedMap(new WeakHashMap<Class, Object>());
ou seja, existe algo de java.util.concurrent que se pode usar? Observe que apenas substituindo por
new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));
Obviamente não vai funcionar
Solução
Goiaba's CacheBuilder A classe permite que você faça isso facilmente.
CacheBuilder.newBuilder().weakKeys().build()
Observe que isso muda a semântica da igualdade de chave para ser ==
ao invés de .equals()
o que não importará no seu caso de usar Class
Instâncias, mas é uma armadilha em potencial.
Outras dicas
Eu não acredito que exista. De fato, o javadoc sugere o uso de coleções.synchronizedmap ()
"Como a maioria das aulas de coleção, essa classe não é sincronizada. Um síncronizado fracoHashmap pode ser construído usando as coleções.
Cafeine é um concorrente popular do cache de goiaba.
- keys automatically wrapped in weak references
- values automatically wrapped in weak or soft references
uso:
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
.weakKeys()
.weakValues()
.build(key -> createExpensiveGraph(key));
A embalagem do mapa sincronizado ainda funciona corretamente para o que você deseja fazer, já que o coletor de lixo pode modificar as referências fracas diretamente a qualquer momento, ignorando o wrapper de mapa sincronizado? Eu acho que o FraftHashmap só funciona em um único modelo rosqueado.
Como mencionado acima, a documentação para o fracoHashmap em https://docs.oracle.com/javase/7/docs/api/java/util/weakhashmap.html diz especificamente:
"Um síncronizado fracoHashmap pode ser construído usando as coleções.
O que me implica que essa técnica deve funcionar em conjunto com o comportamento do coletor de lixo (a menos que a documentação seja buggy!)
Se você estiver usando o Java 7 ou acima, este caso de uso é resolvido de maneira segura por fio com ClassValue
https://docs.oracle.com/javase/7/docs/api/java/lang/classvalue.html Se você precisar do uso de remove
, pense cuidadosamente sobre a simultaneidade e leia o documento completamente.
Se você estiver usando o Java 6 ou abaixo. Não, você precisa sincronizar um hashmap fraco.
A embalagem do mapa sincronizado ainda funciona corretamente para o que você deseja fazer, já que o coletor de lixo pode modificar as referências fracas diretamente a qualquer momento, ignorando o wrapper de mapa sincronizado? Eu acho que o FraftHashmap só funciona em um único modelo rosqueado.