[Go菜牛系列]常见并发模式

本文来瞅瞅常见并发模式的用法. 在大多数语言中,为了解决线程同步问题都会用到加锁的方法;Go也不例外,但是Go也提供了另外的方式来解决同步通信问题:将共享的值通过通道来进行传输.实践中通过goroutine和channel的配合使用实现了这一特性.

  • 通过互斥锁实现同步通信
package main

import (
        "fmt"
        "sync"
)

func main() {
        var mux sync.Mutex

        // 先锁一次
        mux.Lock()
        go func() {
                fmt.Println("Hello my friend!")
                // 在后台线程中解锁
                mux.Unlock()
        }()
        // 尝试再锁一次,由于锁已被占用会阻塞直到解锁
        mux.Lock()
}
  • 通过sync.WaitGroup实现多个线程的同步
package main

import (
	"fmt"
	"sync"
)

func main() {
	// 创建waitgroup
	var wg sync.WaitGroup

	// 开启10个打印线程
	for i:=0; i<10; i+=1 {
		// 每开启一个线程前,等待事件计数加1
		wg.Add(1)

		idx := i
		go func(index int) {
			fmt.Printf("[%d]Hello my friend!\n", index)
			// 向通道写数据
			wg.Done()
		}(idx)
	}

	// Wait方法,等待所有事件完成
	wg.Wait()
}
  • 通过channel实现同步通信
package main

import (
	"fmt"
)

func main() {
	// 创建一个无缓存通道
	done := make(chan int)

	go func() {
		fmt.Println("Hello my friend!")
		// 向通道写数据
		done <- 1
	}()

	// 堵塞等待接收数据
	<-done
}
发布了388 篇原创文章 · 获赞 1062 · 访问量 247万+

猜你喜欢

转载自blog.csdn.net/moxiaomomo/article/details/105718491
今日推荐