如何用Go语言编写可重入的互斥锁?

2026-05-29 13:342阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2683个文字,预计阅读时间需要11分钟。

如何用Go语言编写可重入的互斥锁?

前言,哈喽,大家好,我是阿松。前几天,一个读者问我如何使用Go语言实现可重入锁,我突然想到Go语言好像没有这个概念,平时在业务开发中也没觉得有这个需求。


前言

哈喽,大家好,我是​​asong​​​。前几天一个读者问我如何使用​​Go​​​语言实现可重入锁,突然想到​​Go​​​语言中好像没有这个概念,平常在业务开发中也没有要用到可重入锁的概念,一时懵住了。之前在写​​java​​​的时候,就会使用到可重入锁,然而写了这么久的​​Go​​,却没有使用过,这是怎么回事呢?这一篇文章就带你来解密~

什么是可重入锁

之前写过​​java​​的同学对这个概念应该了如指掌,可重入锁又称为递归锁,是指在同一个线程在外层方法获取锁的时候,在进入该线程的内层方法时会自动获取锁,不会因为之前已经获取过还没释放而阻塞。美团技术团队的一篇关于锁的文章当中针对可重入锁进行了举例:

假设现在有多个村民在水井排队打水,有管理员正在看管这口水井,村民在打水时,管理员允许锁和同一个人的多个水桶绑定,这个人用多个水桶打水时,第一个水桶和锁绑定并打完水之后,第二个水桶也可以直接和锁绑定并开始打水,所有的水桶都打完水之后打水人才会将锁还给管理员。这个人的所有打水流程都能够成功执行,后续等待的人也能够打到水。这就是可重入锁。

下图摘自美团技术团队分享的文章:



如果是非可重入锁,,此时管理员只允许锁和同一个人的一个水桶绑定。第一个水桶和锁绑定打完水之后并不会释放锁,导致第二个水桶不能和锁绑定也无法打水。当前线程出现死锁,整个等待队列中的所有线程都无法被唤醒。

阅读全文

本文共计2683个文字,预计阅读时间需要11分钟。

如何用Go语言编写可重入的互斥锁?

前言,哈喽,大家好,我是阿松。前几天,一个读者问我如何使用Go语言实现可重入锁,我突然想到Go语言好像没有这个概念,平时在业务开发中也没觉得有这个需求。


前言

哈喽,大家好,我是​​asong​​​。前几天一个读者问我如何使用​​Go​​​语言实现可重入锁,突然想到​​Go​​​语言中好像没有这个概念,平常在业务开发中也没有要用到可重入锁的概念,一时懵住了。之前在写​​java​​​的时候,就会使用到可重入锁,然而写了这么久的​​Go​​,却没有使用过,这是怎么回事呢?这一篇文章就带你来解密~

什么是可重入锁

之前写过​​java​​的同学对这个概念应该了如指掌,可重入锁又称为递归锁,是指在同一个线程在外层方法获取锁的时候,在进入该线程的内层方法时会自动获取锁,不会因为之前已经获取过还没释放而阻塞。美团技术团队的一篇关于锁的文章当中针对可重入锁进行了举例:

假设现在有多个村民在水井排队打水,有管理员正在看管这口水井,村民在打水时,管理员允许锁和同一个人的多个水桶绑定,这个人用多个水桶打水时,第一个水桶和锁绑定并打完水之后,第二个水桶也可以直接和锁绑定并开始打水,所有的水桶都打完水之后打水人才会将锁还给管理员。这个人的所有打水流程都能够成功执行,后续等待的人也能够打到水。这就是可重入锁。

下图摘自美团技术团队分享的文章:



如果是非可重入锁,,此时管理员只允许锁和同一个人的一个水桶绑定。第一个水桶和锁绑定打完水之后并不会释放锁,导致第二个水桶不能和锁绑定也无法打水。当前线程出现死锁,整个等待队列中的所有线程都无法被唤醒。

阅读全文