type RWMutex … const rwmutexMaxReaders … // RLock locks rw for reading. // // It should not be used for recursive read locking; a blocked Lock // call excludes new readers from acquiring the lock. See the // documentation on the [RWMutex] type. func (rw *RWMutex) RLock() { … } // TryRLock tries to lock rw for reading and reports whether it succeeded. // // Note that while correct uses of TryRLock do exist, they are rare, // and use of TryRLock is often a sign of a deeper problem // in a particular use of mutexes. func (rw *RWMutex) TryRLock() bool { … } // RUnlock undoes a single [RWMutex.RLock] call; // it does not affect other simultaneous readers. // It is a run-time error if rw is not locked for reading // on entry to RUnlock. func (rw *RWMutex) RUnlock() { … } func (rw *RWMutex) rUnlockSlow(r int32) { … } // Lock locks rw for writing. // If the lock is already locked for reading or writing, // Lock blocks until the lock is available. func (rw *RWMutex) Lock() { … } // TryLock tries to lock rw for writing and reports whether it succeeded. // // Note that while correct uses of TryLock do exist, they are rare, // and use of TryLock is often a sign of a deeper problem // in a particular use of mutexes. func (rw *RWMutex) TryLock() bool { … } // Unlock unlocks rw for writing. It is a run-time error if rw is // not locked for writing on entry to Unlock. // // As with Mutexes, a locked [RWMutex] is not associated with a particular // goroutine. One goroutine may [RWMutex.RLock] ([RWMutex.Lock]) a RWMutex and then // arrange for another goroutine to [RWMutex.RUnlock] ([RWMutex.Unlock]) it. func (rw *RWMutex) Unlock() { … } // syscall_hasWaitingReaders reports whether any goroutine is waiting // to acquire a read lock on rw. This exists because syscall.ForkLock // is an RWMutex, and we can't change that without breaking compatibility. // We don't need or want RWMutex semantics for ForkLock, and we use // this private API to avoid having to change the type of ForkLock. // For more details see the syscall package. // //go:linkname syscall_hasWaitingReaders syscall.hasWaitingReaders func syscall_hasWaitingReaders(rw *RWMutex) bool { … } // RLocker returns a [Locker] interface that implements // the [Locker.Lock] and [Locker.Unlock] methods by calling rw.RLock and rw.RUnlock. func (rw *RWMutex) RLocker() Locker { … } type rlocker … func (r *rlocker) Lock() { … } func (r *rlocker) Unlock() { … }