github.com/wangyougui/gf/v2@v2.6.5/internal/mutex/mutex.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/wangyougui/gf. 6 7 // Package mutex provides switch of concurrent safe feature for sync.Mutex. 8 package mutex 9 10 import ( 11 "sync" 12 ) 13 14 // Mutex is a sync.Mutex with a switch for concurrent safe feature. 15 type Mutex struct { 16 // Underlying mutex. 17 mutex *sync.Mutex 18 } 19 20 // New creates and returns a new *Mutex. 21 // The parameter `safe` is used to specify whether using this mutex in concurrent safety, 22 // which is false in default. 23 func New(safe ...bool) *Mutex { 24 mu := Create(safe...) 25 return &mu 26 } 27 28 // Create creates and returns a new Mutex object. 29 // The parameter `safe` is used to specify whether using this mutex in concurrent safety, 30 // which is false in default. 31 func Create(safe ...bool) Mutex { 32 if len(safe) > 0 && safe[0] { 33 return Mutex{ 34 mutex: new(sync.Mutex), 35 } 36 } 37 return Mutex{} 38 } 39 40 // IsSafe checks and returns whether current mutex is in concurrent-safe usage. 41 func (mu *Mutex) IsSafe() bool { 42 return mu.mutex != nil 43 } 44 45 // Lock locks mutex for writing. 46 // It does nothing if it is not in concurrent-safe usage. 47 func (mu *Mutex) Lock() { 48 if mu.mutex != nil { 49 mu.mutex.Lock() 50 } 51 } 52 53 // Unlock unlocks mutex for writing. 54 // It does nothing if it is not in concurrent-safe usage. 55 func (mu *Mutex) Unlock() { 56 if mu.mutex != nil { 57 mu.mutex.Unlock() 58 } 59 }