Sobes.tech
Back to questions
Senior
7

Расскажи про паттерны проектирования. Что такое double-checked locking (блокировка с двойной проверкой) и для чего применяется?

Companies where asked
Холодильник.руХолодильник.ру

Answer from AI

sobes.tech AI

Паттерны проектирования — это проверенные решения типичных задач разработки, которые помогают создавать гибкие, масштабируемые и поддерживаемые системы.

Double-checked locking (блокировка с двойной проверкой) — это паттерн, применяемый для ленивой инициализации ресурсов в многопоточной среде с минимизацией затрат на синхронизацию. Идея в том, чтобы сначала проверить, инициализирован ли ресурс без блокировки, и только если нет — захватить блокировку и проверить снова перед инициализацией.

Это позволяет избежать дорогостоящей блокировки при каждом обращении к ресурсу после его инициализации.

Пример на Go (упрощённо):

var instance *MyType
var mu sync.Mutex

func GetInstance() *MyType {
    if instance == nil {           // первая проверка без блокировки
        mu.Lock()
        defer mu.Unlock()
        if instance == nil {       // вторая проверка с блокировкой
            instance = &MyType{}
        }
    }
    return instance
}

Важно учитывать, что в некоторых языках и платформах double-checked locking может быть небезопасен без дополнительных гарантий памяти (например, volatile в Java). В Go это обычно безопасно при правильном использовании синхронизации.