// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package sync provides basic synchronization primitives such as mutual // exclusion locks. Other than the [Once] and [WaitGroup] types, most are intended // for use by low-level library routines. Higher-level synchronization is // better done via channels and communication. // // Values containing the types defined in this package should not be copied.
package sync import ( isync ) // A Mutex is a mutual exclusion lock. // The zero value for a Mutex is an unlocked mutex. // // A Mutex must not be copied after first use. // // In the terminology of [the Go memory model], // the n'th call to [Mutex.Unlock] “synchronizes before” the m'th call to [Mutex.Lock] // for any n < m. // A successful call to [Mutex.TryLock] is equivalent to a call to Lock. // A failed call to TryLock does not establish any “synchronizes before” // relation at all. // // [the Go memory model]: https://go.dev/ref/mem type Mutex struct { _ noCopy mu isync.Mutex } // A Locker represents an object that can be locked and unlocked. type Locker interface { Lock() Unlock() } // Lock locks m. // If the lock is already in use, the calling goroutine // blocks until the mutex is available. func ( *Mutex) () { .mu.Lock() } // TryLock tries to lock m 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 ( *Mutex) () bool { return .mu.TryLock() } // Unlock unlocks m. // It is a run-time error if m is not locked on entry to Unlock. // // A locked [Mutex] is not associated with a particular goroutine. // It is allowed for one goroutine to lock a Mutex and then // arrange for another goroutine to unlock it. func ( *Mutex) () { .mu.Unlock() }