Go实战之channel通道实现互斥锁的功能

结论:利用缓冲大小为 1 的 channel来实现互斥锁mutex。实现原理:如果缓冲满了,发送(写入)到通道时将会阻塞;如果通道清空,发送时就会解除阻塞。

package main
import (
	"errors"
	"fmt"
	"os"
	"sync"
)
var lock sync.Mutex
/**
【通过channel管道实现Mutex互斥锁】
缓冲大小为 1 的 channel 具有如下的特性:如果缓冲满了,发送(写入)到通道时将会阻塞;如果通道清空,发送时就会解除阻塞。
显然,这种 channel 的阻塞特性是可取的,与互斥锁的特性做个对比:
缓冲满时 <--> 上锁
缓冲腾空 <--> 解锁
**/
func main() {
	file, err := os.Create("record3.txt")

	defer func() {
		if err := recover(); err != nil {
			fmt.Printf("Error encounter: %w", err)
		}
		file.Close()
	}()
	if err != nil {
		panic(errors.New("Cannot create/open file"))
	}
	ss := []string{ //string slice literals
		"James",
		"Avery",
		"Peter",
		"John",
		"Beau",
	}
	chanLock := make(chan int, 1) //1
	var wg sync.WaitGroup // WaitGroup 来保证子 goroutine 完成任务之前,主协程不会退出。
	for _, str := range ss { //2
		wg.Add(1) //
		go func(aString string) {
			// lock.Lock() 互斥锁的实现方式
			chanLock <- 1 //3 
			for i := 0; i < 1000; i++ {
				file.WriteString(aString + "\n")
			}
			// lock.Unlock()
			<-chanLock //4 
			wg.Done()  //5
		}(str) //pass by value
	}
	wg.Wait()
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值