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

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,
    который пытается захватить обычную блокировку
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить