РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
840 of 1593 menu

Метод sync.RWMutex.Unlock

Метод Unlock используется для освобождения блокировки записи (write lock), которая была ранее захвачена методом Lock того же мьютекса типа sync.RWMutex. Если блокировка записи не удерживается текущей горутиной, вызов Unlock приведет к панике во время выполнения программы. Данный метод позволяет другим горутинам получить доступ к защищенным данным как на чтение, так и на запись.

Синтаксис

rwMutex.Unlock()

Метод не принимает параметров и не возвращает значений.

Пример

Давайте рассмотрим базовый пример использования метода Unlock для освобождения блокировки записи после изменения общей переменной:

package main import ( "fmt" "sync" ) func main() { var rwMutex sync.RWMutex counter := 0 rwMutex.Lock() counter++ fmt.Println("Counter incremented to:", counter) rwMutex.Unlock() fmt.Println("Final counter value:", counter) }

Результат выполнения кода:

"Counter incremented to: 1" "Final counter value: 1"

В этом примере мы захватываем блокировку записи с помощью Lock, увеличиваем счетчик, а затем освобождаем блокировку вызовом Unlock.

Пример

Рассмотрим пример с несколькими горутинами, где метод Unlock позволяет освободить доступ для других горутин:

package main import ( "fmt" "sync" "time" ) func main() { var rwMutex sync.RWMutex sharedData := 0 go func() { rwMutex.Lock() sharedData = 42 fmt.Println("Write goroutine: data set to 42") rwMutex.Unlock() }() time.Sleep(100 * time.Millisecond) rwMutex.RLock() fmt.Println("Read goroutine: data is", sharedData) rwMutex.RUnlock() }

Результат выполнения кода:

"Write goroutine: data set to 42" "Read goroutine: data is 42"

После того как горутина записи вызывает Unlock, блокировка освобождается, и горутина чтения может безопасно прочитать данные с помощью RLock.

Пример

Важно правильно использовать Unlock с отложенным вызовом для гарантии освобождения блокировки даже при возникновении паники:

package main import ( "fmt" "sync" ) func main() { var rwMutex sync.RWMutex func() { rwMutex.Lock() defer rwMutex.Unlock() fmt.Println("Inside critical section") // Если здесь возникнет panic, блокировка все равно будет освобождена }() fmt.Println("Mutex unlocked safely") }

Результат выполнения кода:

"Inside critical section" "Mutex unlocked safely"

Использование defer с Unlock гарантирует, что блокировка будет освобождена в любом случае, предотвращая взаимные блокировки.

Смотрите также

  • метод sync.RWMutex.Lock,
    который захватывает блокировку записи
  • метод sync.RWMutex.RLock,
    который захватывает блокировку чтения
  • метод sync.RWMutex.RUnlock,
    который освобождает блокировку чтения
  • метод sync.Mutex.Unlock,
    который освобождает блокировку обычного мьютекса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить