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.