Это принципиально небезопасно. После того, как поток 1 записал true
в receivedInput
, не гарантируется, что поток 2 увидит новое значение. Например, компилятор может оптимизировать ваш код, делая определенные предположения о значении receivedInput
во время его использования в качестве условия if или кэшируя его в регистре, поэтому вы не гарантируете, что основная память будет фактически прочитана в время условие if оценивается. Кроме того, и компилятор, и процессор могут изменять порядок чтения и записи для оптимизации, например, true
может быть записано в receivedInput
перед getLine()
и processArguments()
.
Более того, полагаться на синхронизацию для синхронизации - очень плохая идея, поскольку часто у вас нет никаких гарантий относительно количества процессорного времени, которое каждый поток получит за данный интервал времени, или того, будет ли оно запланировано в данный интервал времени вообще .
Распространенная ошибка - думать, что здесь может помочь receivedInput
volatile
. Фактически, volatile
гарантирует, что значения фактически считываются / записываются в основную память (вместо, например, кэширования в регистре) и что операции чтения и записи переменной упорядочены относительно друг друга. Однако это не гарантирует, что чтение и запись переменной volatile
упорядочены относительно других инструкций.
Вам нужны барьеры памяти или надлежащий механизм синхронизации, чтобы это работало так, как вы ожидаете.