go并发编程系列三:线程的按序执行(竞争执行)

背景:在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)
    }
}

在下一篇文章中,我们将讲解听话学生和调皮学生班级的管理。

posted @ 2023-09-02 15:32  jamstack  阅读(26)  评论(0编辑  收藏  举报