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ę.

questionAnswers(1)

yourAnswerToTheQuestion