Метод sync.RWMutex.Unlock

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

Синтаксис

gorwMutex.Unlock()

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

Пример

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

gopackage 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)
}

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

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

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

Пример

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

gopackage 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()
}

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

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

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

Пример

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

gopackage 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")
}

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

go"Inside critical section"
"Mutex unlocked safely"

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

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

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