¿Es apropiado usar AtomicReference.compareAndSet para establecer una referencia a los resultados de una llamada de base de datos?

Estoy implementando un caché simple con el caché almacenado como una referencia atómica.

private AtomicReference<Map<String, String>> cacheData;

El objeto de caché debe ser poblado (perezosamente) desde una tabla de base de datos.

Proporciono un método para devolver los datos del caché a una persona que llama, pero si los datos son nulos (es decir, no están cargados), el código debe cargar los datos de la base de datos. Para evitar la sincronización, pensé en usar el método compareAndSet ():

public Object getCacheData() {
  cacheData.compareAndSet(null, getDataFromDatabase()); // atomic reload only if data not set!
  return Collections.unmodifiableMap(cacheData.get());
}

¿Está bien usar compareAndSet de esta manera? ¿Involucrar a una llamada de base de datos como parte de la acción atómica? ¿Es mejor / peor que simplemente sincronizar el método?

Muchas gracias por cualquier consejo..

Respuestas a la pregunta(1)

Su respuesta a la pregunta