Considérez l'implémentation suivante de quelque type de cache de taille fixe, qui permet la recherche par une poignée entière:
static class HandleCache {
private final AtomicInteger counter = new AtomicInteger();
private final Map handles = new ConcurrentHashMap<>();
private final Data[] array = new Data[100_000];
int getHandle(Data data) {
return handles.computeIfAbsent(data, k -> {
int i = counter.getAndIncrement();
if (i >= array.length) {
throw new IllegalStateException("débordement du tableau");
}
array[i] = data;
return i;
});
}
Data getData(int handle) {
return array[handle];
}
}
Il y a un magasin de tableau à l'intérieur de la fonction de calcul, qui n'est synchronisé d'aucune manière. Serait-il autorisé par le modèle mémoire de Java pour d'autres threads de lire une valeur nulle dans ce tableau plus tard?
PS: Est-ce que le résultat changerait si l'id retourné de getHandle
était stocké dans un champ final
et seulement accédé à travers ce champ par d'autres threads?