Ленивая загрузка без блокировок в многопоточном приложении

Что произойдет, если два потока прочитают это свойство в одно и то же время?

public static HugeType HugeType
{
    get
    {
        if (tenderCache == null)
        {
            tenderCache = Config.Get<HugeType>("HugeType", null);
        }
        return tenderCache;
    }
}

Мой объект доступен только для чтения, и он не критичен, если созданы два экземпляра. Должен ли я добавлять блокировки в любом случае?

Ответ 1

Поскольку у вас нет синхронизации, можно вызвать метод инициализации много раз, возможно, даже если другие потоки полностью завершили инициализацию (из-за отсутствия барьера памяти). Если вам не нужно выполнять операцию инициализации несколько раз, и он всегда будет возвращать одинаковое правильное значение независимо от того, сколько раз он вызывал, и даже если несколько вызовов к нему выполняются одновременно, то код, безусловно, будет работать, даже если он также не будет работать.

Сказав, что на самом деле правильно убедиться, что инициализация выполняется только один раз, очень просто, учитывая, что это уже проблема. Вы можете просто сохранить Lazy<HugeType> в своем поле, а не HugeType и Lazy позаботится о синхронизации инициализации для вас.