Значение highest не определено надёжно: есть конкурентное чтение и запись, а main не ждёт горутины. Новая семантика переменной цикла не устраняет гонку на общем highest.
Небезопасный конкурентный доступ к общим переменным
Значение highest не определено надёжно: есть конкурентное чтение и запись, а main не ждёт горутины. Новая семантика переменной цикла не устраняет гонку на общем highest.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какое значение будет выведено программой при её запуске.
func main() {
var highest int
for counter := 1000; counter > 0; counter-- {
go func() {
if counter % 2 == 0 && counter > highest {
highest = counter
}
}()
}
fmt.Printf("Maximum is %d", highest)
}
Ответ
Значение highest не определено надёжно: есть конкурентное чтение и запись, а main не ждёт горутины. Новая семантика переменной цикла не устраняет гонку на общем highest.
Передавайте counter аргументом, проверяйте и обновляйте максимум под одной блокировкой и дождитесь всех задач. Условие counter > highest тоже должно находиться внутри lock, иначе обновление может опираться на устаревшее значение. После корректной синхронизации максимум чётных чисел 1–1000 равен 1000. Для этой задачи обычный последовательный цикл проще.