Дорога (или кому-либо, кому нужно это значение) должна иметь доступ к экземпляру TrafficLight и спрашивать его, зеленый ли он.Вы можете предоставить логический метод.
НО доступ к этому свойству (стоп) должен быть защищен.ключевое слово volatile не очень помогает (см. ниже).
Я должен сделать что-то вроде:
private synchronized void toogleStopped() { // guarded
this.stop = !this.stop;
}
public synchronized boolean isStopped() { // guarded
return this.stop;
}
События
Если некоторые другиеобъект должен реагировать на изменения в освещении (реагировать на событие «свет изменился»), использовать шаблон проектирования Observer, как предложено @TejasArjun.
Почему volatile
не помогает
volatile
позволяет Java избегать предположения, что переменная не изменена "извне".Поэтому, если поток устанавливает свое значение (или читает его раньше), при втором чтении будет использоваться (возможно) кэшированное значение (уже сохраненное в регистре ЦП или что-то в этом роде).volatile заставляет Java всегда читать значение из памяти.
Сказал, что проблема с потерянным обновлением остается даже с ключевым словом volatile
.Одной веткой можно 1) прочитать 2) написать.Другой поток может сделать то же самое.И они могут делать это в следующем порядке:
Поток 1 читает ложь Поток 2 читает ложь Поток 1 устанавливает истину (при условии, что он прочитал ложь) Поток 2 устанавливает истину (предполагая, что читается ложь)
это нехорошо:)
Так что вы должны сказать Java, чтобы сделать чтение и запись атомарно.Вот почему мы можем использовать ключевое слово synchronized
, чтобы убедиться, что поток выполняет весь синхронизированный блок одновременно, не чередуясь с другим потоком.