Метод 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,
который освобождает блокировку обычного мьютекса