sync.RWMutex.TryRLock
Метод sync.RWMutex.TryRLock пытается захватить блокировку на чтение (read lock) мьютекса.
В отличие от метода RLock, который блокирует выполнение горутины до момента успешного захвата блокировки,
TryRLock возвращает управление немедленно. Он возвращает true, если блокировка на чтение была успешно захвачена,
и false, если в данный момент блокировка на запись удерживается другой горутиной.
Этот метод полезен в ситуациях, когда горутина не должна ждать освобождения блокировки, а может выполнить альтернативные действия, если доступ к данным временно недоступен. Метод не блокируется и не вызывает паники.
Синтаксис
ok := rwmutex.TryRLock()
Пример
Попробуем захватить блокировку на чтение, когда блокировка на запись не удерживается:
package main
import (
"fmt"
"sync"
)
func main() {
var rw sync.RWMutex
if ok := rw.TryRLock(); ok {
fmt.Println("read lock acquired")
rw.RUnlock()
} else {
fmt.Println("failed to acquire read lock")
}
}
Результат выполнения кода:
"read lock acquired"
Пример
Попробуем захватить блокировку на чтение, когда блокировка на запись уже удерживается:
package main
import (
"fmt"
"sync"
)
func main() {
var rw sync.RWMutex
rw.Lock() // захват блокировки на запись
if ok := rw.TryRLock(); ok {
fmt.Println("read lock acquired")
rw.RUnlock()
} else {
fmt.Println("failed to acquire read lock")
}
rw.Unlock() // освобождение блокировки на запись
}
Результат выполнения кода:
"failed to acquire read lock"
Пример
Покажем, что несколько горутин могут одновременно удерживать блокировку на чтение, и попытка захвата новой блокировки на чтение будет успешной:
package main
import (
"fmt"
"sync"
)
func main() {
var rw sync.RWMutex
// Первая горутина захватывает блокировку на чтение
rw.RLock()
// Вторая горутина пытается захватить блокировку на чтение
if ok := rw.TryRLock(); ok {
fmt.Println("second read lock acquired")
rw.RUnlock()
} else {
fmt.Println("failed to acquire second read lock")
}
rw.RUnlock() // освобождение первой блокировки на чтение
}
Результат выполнения кода:
"second read lock acquired"
Смотрите также
-
метод
sync.RWMutex.RLock,
который блокирует выполнение до захвата блокировки на чтение -
метод
sync.RWMutex.TryLock,
который пытается захватить блокировку на запись -
метод
sync.RWMutex.RUnlock,
который освобождает блокировку на чтение -
метод
sync.Mutex.TryLock,
который пытается захватить обычную блокировку