github.com/chenjiandongx/go-queue@v0.0.0-20191023082232-e2a36f382f84/queue.go (about) 1 package collections 2 3 import ( 4 "container/list" 5 "sync" 6 ) 7 8 /* 9 RWMutex 的使用主要事项 10 1. 读锁的时候无需等待读锁的结束 11 2. 读锁的时候要等待写锁的结束 12 3. 写锁的时候要等待读锁的结束 13 4. 写锁的时候要等待写锁的结束 14 15 RWMutex 的四种操作方法 16 RLock() //读锁定 17 RUnlock() //读解锁 18 Lock() //写锁定 19 Unlock() //写解锁 20 */ 21 22 type Queue struct { 23 data *list.List 24 mut *sync.RWMutex 25 } 26 27 func NewQueue() *Queue { 28 return &Queue{data: list.New(), mut: new(sync.RWMutex)} 29 } 30 31 func (q *Queue) Put(v interface{}) { 32 defer q.mut.Unlock() 33 q.mut.Lock() 34 q.data.PushFront(v) 35 } 36 37 func (q *Queue) Get() (interface{}, bool) { 38 defer q.mut.Unlock() 39 q.mut.Lock() 40 if q.data.Len() > 0 { 41 iter := q.data.Back() 42 v := iter.Value 43 q.data.Remove(iter) 44 return v, true 45 } 46 return nil, false 47 } 48 49 func (q *Queue) Qsize() int { 50 defer q.mut.RUnlock() 51 q.mut.RLock() 52 return q.data.Len() 53 } 54 55 func (q *Queue) IsEmpty() bool { 56 defer q.mut.RUnlock() 57 q.mut.RLock() 58 return !(q.data.Len() > 0) 59 }