sync.RWMutex.TryRLock

Метод sync.RWMutex.TryRLock пытается захватить блокировку на чтение (read lock) мьютекса. В отличие от метода RLock, который блокирует выполнение горутины до момента успешного захвата блокировки, TryRLock возвращает управление немедленно. Он возвращает true, если блокировка на чтение была успешно захвачена, и false, если в данный момент блокировка на запись удерживается другой горутиной.

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

Синтаксис

gook := rwmutex.TryRLock()

Пример

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

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

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

go"read lock acquired"

Пример

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

gopackage 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() // освобождение блокировки на запись
}

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

go"failed to acquire read lock"

Пример

Покажем, что несколько горутин могут одновременно удерживать блокировку на чтение, и попытка захвата новой блокировки на чтение будет успешной:

gopackage 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() // освобождение первой блокировки на чтение
}

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

go"second read lock acquired"

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

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