加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

【Go】sync.Mutex和sync.RWMutex

发布时间:2020-12-16 09:33:12 所属栏目:大数据 来源:网络整理
导读:Go语言宣扬用通讯的方式共享数据。 Go语言以独特的并发编程模型傲视群雄,与并发编程关系最紧密的代码包就是sync包,意思是同步。同步的用途有两个,一个是避免多个线程在同一时刻操作同一个数据块,另一个是协调多个线程,以避免它们在同一时刻执行同一块代

  Go语言宣扬用通讯的方式共享数据。

  Go语言以独特的并发编程模型傲视群雄,与并发编程关系最紧密的代码包就是sync包,意思是同步。同步的用途有两个,一个是避免多个线程在同一时刻操作同一个数据块,另一个是协调多个线程,以避免它们在同一时刻执行同一块代码。由于这一的数据库和代码块的背后都隐含着一种或多种资源,所以可以把它们看成是共享资源,同步就是控制多个线程对共享资源的访问。

  一个线程在想要访问某一个共享资源时,需要先申请对该资源的访问权限,并且只有在申请成功之后,访问才能真正开始,而当线程对共享资源的访问结束时,它还必须归还对该资源的访问权限,若要再次访问仍需申请。多个并发运行的线程对一个共享资源的访问是完全串行的。

  在Go语言中,最常用的同步工具当属互斥量(mutex)。sync包中的Mutex就是与其对应的类型,该类型的值可以被称为互斥量或互斥锁。一个互斥锁可以被用来保护一个临界区或者一组临界区,可以通过它来保证,在同一时刻只有一个goroutin处于该临界区之内。每当有goroutine想进入临界区时,都需要先对它进行锁定,并且每个goroutine离开临界区时,都要及时对它进行解锁。锁定操作可以通过调用互斥锁的Lock方法实现,解锁操作可以调用互斥锁的Unlock方法

mu.Lock()
_,err := writer.Write([]byte(data))
if err != nil {
 log.Printf("error: %s [%d]",err,id)
}
mu.Unlock()

?

使用互斥锁的注意事项有:

1.不要重复锁定互斥锁

  对一个已经被锁定的互斥锁进行锁定,会理解阻塞当前的goroutine

不要忘记解锁互斥锁,必要时使用defer语句

不要对尚未锁定或者已解锁的互斥锁解锁

不要在多个函数之间直接传递互斥锁

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读