Поскольку в doprint()
переменная done
доступна (считывается) без синхронизации.
Представьте себе, что первый запуск процедуры doprint()
завершается до того, как запланирован запуск второй. Первый пишет done
(в setup()
), а 2-ая программа пытается прочитать done
: должно ли это чтение дать результат, написанный первой программой? Синхронизация отсутствует: неопределенное поведение. Может случиться так, что done
будет наблюдаться как true
, и, таким образом, setup()
не будет вызван, и это может быть запись в a
не будет наблюдаться, и, таким образом, начальное нулевое значение (пустая строка) напечатано.
При чтении переменных всегда наблюдаются предыдущие записи (предыдущие по времени) в процедуре single . Не гарантируется, что записи, сделанные goroutine, будут выполняться в другой goroutine, если между ними нет синхронизации.