У меня есть кеш, который я реализовал с помощью simeple HashMap. как -
HashMap<String,String> cache = new HashMap<String,String>();
Этот кеш используется большую часть времени для чтения значений из него. У меня есть другой метод, который перезагружает кеш и внутри этого метода. Я в основном создаю новый кеш и затем назначаю ссылку. Насколько я понимаю, назначение объектной ссылки - это Atomic в Java.
public class myClass {
private HashMap<String,String> cache = null;
public void init() {
refreshCache();
}
// this method can be called occasionally to update the cache.
public void refreshCache() {
HashMap<String,String> newcache = new HashMap<String,String>();
// code to fill up the new cache
// and then finally
cache = newcache; //assign the old cache to the new one in Atomic way
}
}
Я понимаю, что если я не буду объявлять кеш как volatile, другие потоки не смогут увидеть изменения, но для моего варианта использования не так важно критиковать изменение кеша в других потоках, и они могут продолжать работать с старым кешем в течение длительного времени.
Вы видите какую-либо проблему с потоками? Подумайте, что многие потоки читают из кеша и только время от времени перезагружается кеш.
Edit- Моя основная путаница в том, что мне не нужно использовать AtomicReference здесь, поскольку сама операция назначения является атомарной?
РЕДАКТИРОВАТЬ - Я понимаю, что для правильного упорядочения я должен отметить кеш как изменчивый. Но если метод refreshCache отмечен как синхронизированный, мне не нужно делать кеш изменчивым, так как синхронизированный блок будет заботиться о порядке и видимости?