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()
}

你可能感兴趣的:(Go 并发模式)