Всем привет, возникли пару вопросиков по ходу решения задачи касательно volatile переменных.
Гуру многопоточности, подскажите пожалуйста =)
1. boolean isStopped не volatile
Есть переменная
public static boolean isStopped = false;
Которая используется в двух нитях для остановки работы
while (!isStopped) {
...
}
Почему у неё нет модификатора volatile, ведь она может закэшироваться?
2. Map<Drug, Integer> allDrugs с не volatile
Несмотря на то, что DrugsController, который содержит эту переменную, имеет synchronised методы для работы с
public static Map<Drug, Integer> allDrugs = new HashMap<Drug, Integer>();
Сама переменная не имеет модификатор volatile, хотя она используется напрямую в другом классе Solution
public static Drug getRandomDrug() {//Исопльзуется в двух рахных нитях
int index = (int) ((Math.random() * 1000) % (drugsController.allDrugs.size()));
List<Drug> drugs = new ArrayList<>(drugsController.allDrugs.keySet());
return drugs.get(index);
}
Разве это потокобезопасно?
drugController одной нити может изменить allDrugs, однако другая не узнает об этом.
Спасибо!
P.S. не прикрепил код решения, тк уже решил правильно.