Всем привет, возникли пару вопросиков по ходу решения задачи касательно 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. не прикрепил код решения, тк уже решил правильно.