Go 并发模式

1. 共享内存

func main() {
    flag := 0
    go func() {
        fmt.Println("Hello World !!!")
        flag = 1
    }()
Loop:
    for {
        if flag == 1 {
            break Loop
        }
    }
}

2. 互斥锁

func main() {
    var mu sync.Mutex
    mu.Lock()
    go func() {
        fmt.Println("Hello World !!!")
        mu.Unlock()
    }()
    mu.Lock()
}

3. 无缓冲channel

func main() {
    done := make(chan int)
    go func() {
        fmt.Println("Hello World !!!")
        <-done
    }()
    done <- 1
}
// 或
func main() {
    done := make(chan int)
    go func() {
        fmt.Println("Hello World !!!")
        done <- 1
    }()
    <-done
}

4. 带缓冲channel

func main() {
    len := 10
    done := make(chan int, len)
    // 开N个后台打印线程
    for i := 0; i < len; i++ {
        go func() {
            fmt.Println("Hello World !!! " + strconv.Itoa(i))
            done <- 1
        }()
    }
    // 等待N个后台线程完成
    for i := 0; i < len; i++ {
        <-done
    }
}

5. sync.WaitGroup

func main() {
    var wg sync.WaitGroup
    // 开N个后台打印线程
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            fmt.Println("Hello World !!! " + strconv.Itoa(i))
            wg.Done()
        }()
    }
    // 等待N个后台线程完成
    wg.Wait()
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。