mirror of https://github.com/golang/go.git
67 lines
1.9 KiB
Go
67 lines
1.9 KiB
Go
// 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 "internal/sync"
|
|
)
|
|
|
|
// 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 (m *Mutex) Lock() {
|
|
m.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 (m *Mutex) TryLock() bool {
|
|
return m.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 (m *Mutex) Unlock() {
|
|
m.mu.Unlock()
|
|
}
|