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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top