Czy należy użyć AtomicReference.compareAndSet, aby ustawić odniesienie do wyników wywołania bazy danych?
Implementuję prostą pamięć podręczną z pamięcią podręczną przechowywaną jako AtomicReference.
private AtomicReference<Map<String, String>> cacheData;
Obiekt pamięci podręcznej powinien być wypełniony (leniwie) z tabeli bazy danych.
Udostępniam metodę zwracania danych z pamięci podręcznej do wywołującego, ale jeśli dane są puste (tzn. Nie załadowane), kod musi załadować dane z bazy danych. Aby uniknąć synchronizacji, pomyślałem o użyciu metody compareAndSet ():
public Object getCacheData() {
cacheData.compareAndSet(null, getDataFromDatabase()); // atomic reload only if data not set!
return Collections.unmodifiableMap(cacheData.get());
}
Czy w ten sposób można użyć compareAndSet, tj. włączyć wywołanie bazy danych jako część akcji atomowej? Czy jest lepszy / gorszy niż tylko synchronizacja metody?
Wielkie dzięki za każdą radę.