Java >> Java tutorial >  >> Tag >> throw

Siden Java 9 HashMap.computeIfAbsent() kaster ConcurrentModificationException ved forsøg på at huske rekursive funktionsresultater

ConcurrentModificationException kastes fordi slowFib ændrer flere nøgler og værdier. Hvis du ser på Java 9 HashMap.computeIfAbsent() kode vil du opdage, at undtagelsen er smidt her:

int mc = modCount;
V v = mappingFunction.apply(key);
if (mc != modCount) { throw new ConcurrentModificationException(); }

Hver påkaldelse af slowFib forsøger at ændre værdier knyttet til nøgler n-1 og n-2 .

modCount kontrol udføres ikke i Java 8 HashMap.computeIfAbsent() kode. Dette er en fejl i Java 8, din tilgang virker ikke i alle tilfælde ifølge JDK-8071667 HashMap.computeIfAbsent() tilføjer en post, som HashMap.get() ikke finder, som tilføjede modCount tjek Java 9:

Hvis funktionen, der leveres til computeIfAbsent, tilføjer elementer til den samme HashTable, som funktionen kaldes fra, og den interne tabel forstørres på grund af dette, vil den nye post blive tilføjet det forkerte sted i kortets interne tabel, hvilket gør den utilgængelig.


Java tag