【Golang】Go语言编程思想(六):Channel,第五节,传统同步机制

传统同步机制

上一节介绍 select 的使用时,展示了一个例子,在该例子中,我们首先在 main 函数中使用 generator() 来开启发送数据的 goroutine,之后使用 creatWorker()worker() 开启接受数据的 goroutine,在 main 函数中使用无限循环和 select 建立了一个总控的程序段。使用 channel 和 select 可以方便地在上述四部分(包括 main 函数的主线程以及三个 goroutine 协程)之间进行通信。

上述逻辑成为 Golang 的 CSP 模型,但 Golang 也是由传统的同步机制的,比如 WaitGroup、Mutex 和 Condition Variable。

比如,下例使用库 sync 当中的 Mutex 方法实现了一个线程安全的 int 类型:

go 复制代码
package main

import (
	"fmt"
	"sync"
	"time"
)

type atomicInt struct {
	value int
	lock  sync.Mutex
}

func (a *atomicInt) increment() {
	a.lock.Lock()
	defer a.lock.Unlock()
	a.value++
}

func (a *atomicInt) get() int {
	a.lock.Lock()
	defer a.lock.Unlock()
	return a.value
}

func main() {
	var a atomicInt
	a.increment()
	go func() {
		a.increment()
	}()
	time.Sleep(time.Millisecond)
	fmt.Println(a.get())
}

Golang 当中应该尽可能地不使用传统的同步机制,而是使用 channel 来进行通信。

相关推荐
慕离桑11 分钟前
HTML语言的数据可视化
开发语言·后端·golang
能来帮帮蒟蒻吗32 分钟前
GO语言学习(17)Gorm的数据库操作
开发语言·学习·golang
阮瑭雅3 小时前
Bash语言的微服务
开发语言·后端·golang
霍徵琅3 小时前
CSS语言的硬件驱动
开发语言·后端·golang
霍珵蕴3 小时前
Lisp语言的计算机视觉
开发语言·后端·golang
褚翾澜3 小时前
Lisp语言的无线通信
开发语言·后端·golang
甄霓裳3 小时前
APL语言的游戏音效
开发语言·后端·golang
冷琅辞12 小时前
Elixir语言的云计算
开发语言·后端·golang
欧宸雅15 小时前
Clojure语言的持续集成
开发语言·后端·golang
褚翾澜16 小时前
Haskell语言的NoSQL
开发语言·后端·golang