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
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ą.
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."
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));
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!)
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ę.
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.
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