Como armazenar informações em cache em um DAO de maneira thread-safe

Eu frequentemente preciso implementar DAOs para alguns dados de referência que não mudam com muita frequência. Eu às vezes coloco em cache isso no campo de coleta no DAO - para que ele seja carregado apenas uma vez e explicitamente atualizado quando necessário.

No entanto, isso traz muitos problemas de simultaneidade - e se outro thread tentar acessar os dados enquanto está carregando ou sendo atualizado.

Obviamente, isso pode ser feito tornando os getters e setters dos dados sincronizados - mas para uma grande aplicação web isso é uma sobrecarga.

Eu incluí um exemplo defeituoso e trivial do que eu preciso como palhaço. Por favor, sugira formas alternativas de implementar isso.

<code>public class LocationDAOImpl implements LocationDAO {

private List<Location> locations = null;

public List<Location> getAllLocations() {
    if(locations == null) {
        loadAllLocations();
    }
    return locations;
}
</code>

Para obter mais informações, estou usando o Hibernate e o Spring, mas esse requisito se aplicaria a várias tecnologias.

Alguns pensamentos adicionais:

Isso não deve ser tratado em código em tudo - em vez deixar ehcache ou similar lidar com isso? Existe um padrão comum para isso que estou perdendo? Obviamente há muitas maneiras de conseguir isso, mas nunca encontrei um padrão que seja simples e sustentável.

Desde já, obrigado!

questionAnswers(6)

yourAnswerToTheQuestion