背景:在go并发编程系列二,你作为班主任,接手了有三个学生的班级,现状是这三个学生很调皮,看起来乱糟糟的,三个学生就是三个线程,怎么变的有序呢?答案是:给线程加锁!加锁需要使用go标准包的sync.Mutex,这是一个互斥锁。
给线程加锁的代码:
package concurrent import ( "fmt" "sync" "time" ) var mutex sync.Mutex // 创建一个互斥锁 func ThreadMutexZhangSan() { mutex.Lock() // 获取互斥锁 defer mutex.Unlock() // 在函数结束时释放互斥锁 for i :=1; i <= 3; i++ { fmt.Println("张三:", i) time.Sleep(time.Millisecond * 500) } } func ThreadMutexLiSi() { mutex.Lock() // 获取互斥锁 defer mutex.Unlock() // 在函数结束时释放互斥锁 for i := 1; i <= 3; i++ { fmt.Println("李四:", i) time.Sleep(time.Millisecond * 500) } } func ThreadMutexWangWu() {
mutex.Lock() // 获取互斥锁
defer mutex.Unlock() // 在函数结束时释放互斥锁
for i := 1; i <= 3; i++ { fmt.Println("王五*:", i) time.Sleep(time.Millisecond * 500) } }
当我们在main.go里再次执行go程时,发现这三个线程不再交替执行了,从无序变的有序起来了,这是你管理班级的第一个成效!然而,班级的管理比我们想象中要复杂,班级里有听话的,有调皮的,我们假定张三、李四是听话的学生,王五是调皮的学生,王五是调皮的学生,用go代码该怎么表示呢?很简单:去掉互斥锁即可!
调皮的王五,go代码表示如下:
func ThreadMutexWangWu() { for i := 1; i <= 3; i++ { fmt.Println("王五*:", i) time.Sleep(time.Millisecond * 500) } }
在下一篇文章中,我们将讲解听话学生和调皮学生班级的管理。
TRANSLATE with x English TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back 标签:班级,调皮,编程,互斥,线程,go,mutex From: https://www.cnblogs.com/jamstack/p/17673741.html