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  }