- С технической точки зрения синхронизация не требуется, чтобы записи в одном потоке воспринимались в другом потоке. То, что вам нужно, это случается до края. Вполне вероятно, что либо
volatile
, либо synchronized
будет использоваться для достижения преимущества до того Оба эти метода приводят к синхронизации с краем. Поэтому на практике вы, вероятно, будете использовать синхронизацию для управления состоянием вашего логического значения.
- Да. Обратите внимание, что вы не меняете состояние объекта Boolean. Вы только изменяете ссылку на логический объект. В разделе 17.7 спецификации языка говорится, что «запись и чтение ссылок всегда атомарны».
Обновление: позвольте мне разъяснить необходимость преграды, предшествующей событию. Без края, предшествующего событию, не гарантируется, что изменения, сделанные одним потоком в переменной, когда-либо будут восприняты другими потоками. Это не просто, что изменение может быть воспринято в неподходящее время, например, между чтением и записью. Изменение может никогда не восприниматься.
Допустим, у нас есть логическая переменная, которую мы инициализируем как false. Тогда мы начинаем две темы. Первый поток устанавливает переменную в true и останавливается. Второй поток постоянно проверяет переменную, пока она не станет истинной, после чего она останавливается. Нет гарантии, что второй поток когда-либо увидит переменную как true.