Я думаю, что у меня есть довольно хорошее представление о ключевом слове volatile
в Java, но я думаю о перефакторинге некоторого кода, и я подумал, что было бы неплохо использовать его.
У меня есть класс, который в основном работает в качестве кеша БД.он содержит несколько объектов, которые он прочитал из базы данных, обслуживает запросы к этим объектам, а затем периодически обновляет базу данных (в зависимости от времени ожидания).Вот этот скелетзатем обновите кеш в фоновом режиме.Но тогда мне нужно будет синхронизировать мой класс (или карту).и тогда я просто обменял бы большую паузу на медленный доступ к каждому кешу.
Тогда я подумал, почему бы не использовать volatile
, я мог бы определить ссылку на карту как volatile
private volatile HashMap mappings =....;
, а затем в get
(или в любом другом месте, где используется переменная mappings), я просто сделал бы локальную копию ссылки:
public Data get(ID id)
{
HashMap local = mappings;
//.. look it up using local
}
, а затем фоновый поток просто загрузил быво временную таблицу, а затем поменяйте местами ссылки в классе
HashMap tmp;
//load tmp from DB
mappings = tmp;//swap variables forcing write barrier
Имеет ли этот подход смысл?и это на самом деле потокобезопасным?