Небезопасный конкурентный доступ к общим переменным

Значение 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. Для этой задачи обычный последовательный цикл проще.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее