Jest java.util.równoległy odpowiednik dla WeakHashMap?

Czy poniższy fragment kodu można przepisać bez użycia Collections.synchronizedMap() z zachowaniem poprawności przy współbieżności?

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

Czyli jest coś z Javy.util.współbieżny można użyć zamiast? Zauważ, że jedynie zastąpienie przez

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

Oczywiście nie zadziała

Author: hoat4, 2010-02-13

6 answers

Klasa Guava ' scachebuilder pozwala ci to łatwo zrobić.

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

Zauważ, że zmienia to kluczową semantykę równości na == zamiast .equals(), co nie ma znaczenia w przypadku używania instancji Class, ale jest potencjalną pułapką.

 35
Author: Steven Schlansker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-13 17:19:36

Nie wydaje mi się. W rzeczywistości javadoc sugeruje użycie kolekcji.synchronizedMap ()

" jak większość klas kolekcji, ta klasa nie jest zsynchronizowana. Zsynchronizowana WeakHashMap może być skonstruowana przy użyciu zbiorów.metoda synchronizedMap."

 19
Author: objects,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-13 00:34:20

Cafeine {[4] } jest popularnym konkurentem Guava cache.

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

Użycie:

LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
 .weakKeys()
 .weakValues()
 .build(key -> createExpensiveGraph(key));
 1
Author: Waldemar Wosiński,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-13 16:15:08

Czy owijanie WeakHashMap w zsynchronizowaną mapę nadal działa poprawnie do tego, co chcesz zrobić, ponieważ garbage collector może modyfikować słabe punkty bezpośrednio w dowolnym momencie, omijając zsynchronizowany wrapper map? Myślę, że WeakHashMap naprawdę działa tylko w model z pojedynczym gwintem.

Jak wspomniano powyżej, dokumentacja dla WeakHashMap na https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html konkretnie mówi:

"A synchronized WeakHashMap może być skonstruowany przy użyciu Kolekcje.metoda synchronizedMap "

Co sugeruje mi, że ta technika musi działać w parze z zachowaniem garbage collector (chyba że dokumentacja jest błędna!)

 0
Author: Slim Duiker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 12:03:55

Jeśli używasz Javy 7 i wyższej, ten przypadek użycia jest rozwiązany w sposób bezpieczny dla wątkuClassValue https://docs.oracle.com/javase/7/docs/api/java/lang/ClassValue.html Jeśli potrzebujesz użycia remove, zastanów się uważnie nad współbieżnością i przeczytaj dokładnie dokument.

Jeśli używasz Javy 6 lub niższej. Nie, musisz zsynchronizować słabą mapę.

 0
Author: Scott Carey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 09:21:40

Czy owijanie WeakHashMap w zsynchronizowaną mapę nadal działa poprawnie dla tego, co chcesz zrobić, ponieważ garbage collector może modyfikować weakreferencje bezpośrednio w dowolnym momencie, omijając zsynchronizowaną owijarkę map? Myślę, że WeakHashMap naprawdę działa tylko w jednym modelu gwintowanym.

 -1
Author: Gene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 19:18:08