Kilka odpowiedzi na SO wspomnieć, że metoda get w HashMap może wpaść w nieskończoną pętlę (np. this one lub this one), jeśli nie jest prawidłowo zsynchronizowany (i zazwyczaj dolnej linii jest "don" nie używaj HashMap w środowisku wielowątkowym, używaj ConcurrentHashMap ").Java HashMap.get (Object) nieskończona pętla
Podczas gdy mogę łatwo zobaczyć, dlaczego jednoczesne wywołania metody HashMap.put (Object) mogą powodować nieskończoną pętlę, nie mogę całkiem zrozumieć, dlaczego metoda get (Object) może utknąć podczas próby odczytania HashMap to jest w tej chwili zmieniane. Spojrzałem na implementation in openjdk i zawiera on cykl, ale warunek wyjścia e != null
powinien zostać spełniony prędzej czy później. Jak może zapętlić się na zawsze? kawałek kodu, który jest wyraźnie wymieniony być narażone na ten problem jest:
public class MyCache {
private Map<String,Object> map = new HashMap<String,Object>();
public synchronized void put(String key, Object value){
map.put(key,value);
}
public Object get(String key){
// can cause in an infinite loop in some JDKs!!
return map.get(key);
}
}
Może ktoś wyjaśnić jak nitki oddanie obiektu do HashMap i kolejny odczyt z może przeplatać w taki sposób, że nieskończona Pętla jest generowana? Czy ma to związek z kwestią spójności pamięci podręcznej lub kolejnością instrukcji CPU (więc problem może się zdarzyć tylko na maszynie wieloprocesorowej)?
Czy możesz go skompilować i sprawić, by działał wiecznie? Wydaje się, że wyjątek będzie rzucany o wiele bardziej niż nieskończona pętla –
Dlaczego nie po prostu "zablokuj" swoją mapę za pomocą 'AtomicReference'? Otrzymasz resztę problemów bez wątków. –
To ćwiczenie jest bezcelowe. Mapa HashMap nie jest bezpieczna dla wątków i pobiera z niej obiekt, podczas gdy inny wątek pisze do niego, nawet jeśli nigdy nie przechodzi w nieskończoną pętlę, może zwrócić nieprawidłowy wynik, uszkodzić mapę HashMap, wygenerować wyjątek lub cokolwiek innego. Dlaczego miałbyś to robić? Wystarczy zsynchronizować metodę get: konieczne jest, aby kod był wątkowo bezpieczny. –