当前位置:首页 > 技术知识 > 正文内容

大厂 Go 编程规范(二):mutex(编程大厂是什么意思)

maynowei10个月前 (08-03)技术知识182


mutex 是golang 的互斥锁,可以保障在多协程的情况下,数据访问的安全。

1、零值有效

我们并不需要mutex指针

mu := new(sync.Mutex)
mu.Lock()

直接可以使用mutex的零值。

var mu sync.Mutex
mu.Lock()

2、mutex可见性

go的map 非线程安全,所以我们经常会通过mutex 给map 加一个锁,大家先看一下第一种方式:

type SMap struct {
  sync.Mutex

  data map[string]string
}
func (m *SMap) Get(k string) string {
  m.Lock()
  defer m.Unlock()

  return m.data[k]
}

然后我们看一下第二种方式

type SMap struct {
  mu sync.Mutex

  data map[string]string
}

func (m *SMap) Get(k string) string {
  m.mu.Lock()
  defer m.mu.Unlock()

  return m.data[k]
}

感觉差别不大,有啥区别?

从封装的角度来看,第二种方法更加优秀。因为第一种方式,SMap 中的mutex 是大写的,意味着,外部可以直接调用 lock 和unlock 方法,破坏了内部封装原则,所以方法二更好。

3、defer更安全

虽然我们可以通过下面的代码,按照需求unlock

p.Lock()
if p.count < 10 {
  p.Unlock()
  return p.count
}

p.count++
newCount := p.count
p.Unlock()

return newCount

但上面的代码存在两个问题,一是如果分支太多很容易导致unlock ,二是可读性较差,到处是unlock。所以更加推荐下面的写法

p.Lock()
defer p.Unlock()

if p.count < 10 {
  return p.count
}

p.count++
return p.count

defer的损耗非常少,大家不必纠结。

相关文章

机器人需求驱动导航新SOTA,成功率提升15%!浙大&amp;vivo联手打造

CogDDN团队 投稿量子位|公众号QbitAI让机器人像人一样边看边理解,来自浙江大学和vivo人工智能实验室的研究团队带来了新进展。正如视频所展示的,机器人在复杂的室内环境中不仅能自主探索,还具备...

C# 中的多线程同步机制:lock、Monitor 和 Mutex 用法详解

在多线程编程中,线程同步是确保多个线程安全地访问共享资源的关键技术。C# 提供了几种常用的同步机制,其中 lock、Monitor 和 Mutex 是最常用的同步工具。本文将全面介绍这三种同步机制的用...

Go 语言中的 RWMutex 源码解析、使用场景及应用分析

Go 语言标准库的 sync 包提供了一些非常重要的并发原语来帮助程序开发者处理并发任务。本文将详细解析 sync 包中的 RWMutex,即读写互斥锁(Reader/Writer Mutex),并结...

聊聊并发编程: Lock(并发锁有哪些)

之前学习了如何使用synchronized关键字来实现同步访问,Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功...

PL/SQL Developer连接Oracle数据库详解

序言:oracle数据库比较难搞,好不容易安装上了,但是怎么连接呢,直接在服务器里用自带的命令行操作太繁琐,所以PL/SQL Developer客户端的好处就显而易见了,今天和大家聊聊客户端具体配置方...