Go语言实现互斥锁、随机数、time、List
Go语言实现互斥锁、随机数、time、List
import( "container/list" "fmt" "math/rand"//备注2:随机数的包 "sync"//备注1:异步任务的包 "time" ) typeINFOstruct{ locksync.Mutex//备注1:异步锁 Namestring Timeint64 } varList*list.List=list.New()//备注3:初始化List变量 funcmain(){ varInfoINFO gofunc(){ fori:=0;i<5;i++{ time.Sleep(time.Duration(1e9*int64(rand.Intn(5))))//备注2:随机数rand.Intn(5)<--->1e9为科学计数法,1*10的9次方 Info.lock.Lock()//备注1:上锁 Info.Name=fmt.Sprint("Name",i)//备注:Sprint采用默认格式将其参数格式化,串联所有输出生成并返回一个字符串。如果两个相邻的参数都不是字符串,会在它们的输出之间添加空格 Info.Time=time.Now().Unix()+3 Info.lock.Unlock()//备注1:解锁 List.PushBack(Info)//备注3:List表达式调用 } }() goGetgoods() select{} } funcGetgoods(){ for{ time.Sleep(1e8) forList.Len()>0{//备注3:List对象的使用 N,T:=List.Remove(List.Front()).(INFO).name()//备注3:List对象的使用和value.(type)的妙用 now:=time.Now().Unix()//备注4:获取当前日期转换后的时间戳 ifT-now<=0{ fmt.Println(N,T,now) continue } time.Sleep(time.Duration((T-now)*1e9)) fmt.Println(N,T,now) } } } func(iINFO)name()(string,int64){ returni.Name,i.Time }
再给大家分享一个互斥锁的实例代码
packagemain import( "fmt" "runtime" "sync" ) var( counterint wgsync.WaitGroup mutexsync.Mutex ) funcmain(){ wg.Add(2) fmt.Println("CreateGoroutines") goincCounter(1) goincCounter(2) fmt.Println("WaitingToFinish") wg.Wait() fmt.Println("FinalCounter:",counter) } funcincCounter(idint){ deferwg.Done() forcount:=0;count<2;count++{ mutex.Lock() { value:=counter runtime.Gosched() value++ counter=value } mutex.Unlock() } }