0

0

Go 互斥锁嵌套操作:多个 goroutine 能否同时获取内部互斥锁?

心靈之曲

心靈之曲

发布时间:2024-11-13 14:42:21

|

840人浏览过

|

来源于php中文网

原创

go 互斥锁嵌套操作:多个 goroutine 能否同时获取内部互斥锁?

go 互斥锁的特性

go 互斥锁通常用于保护共享资源,以确保一次只有一个 goroutine 可以访问该资源。然而,在某些情况下,可能出现表征互斥锁嵌套操作的问题。

互斥锁嵌套问题

以下代码演示了一个嵌套互斥锁操作的示例:

package main

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

func main() {

    var mutex sync.mutex
    wait := sync.waitgroup{}

    fmt.println("locked")
    mutex.lock()

    for i := 1; i <= 3; i++ {
        wait.add(1)

        go func(i int) {
            fmt.println("not lock:", i)

            mutex.lock()
            fmt.println("lock:", i)

            time.sleep(time.second)

            fmt.println("unlock:", i)
            mutex.unlock()

            defer wait.done()
        }(i)
    }

    time.sleep(time.second)
    fmt.println("unlocked")
    mutex.unlock()

    wait.wait()

}

在此代码中,在 goroutine 内部再次对互斥锁进行锁定操作。这可能会导致意想不到的行为,因为该代码可能会造成死锁。

正确的理解

Amazon Nova
Amazon Nova

亚马逊云科技(AWS)推出的一系列生成式AI基础模型

下载

理解代码的关键在于认识到外部互斥锁(在主 goroutine 中获取的)并不影响内部互斥锁(在 goroutine 内获取的)的获取。这是因为 goroutine 是独立的执行线程,每个线程都有自己的互斥锁。

当主 goroutine 获取外部互斥锁时,它实际上阻止其他 goroutine获取该外部互斥锁。但是,内部互斥锁不受外部互斥锁的影响,因此每个 goroutine都可以独立获取其内部互斥锁。

代码输出

代码的输出如下:

Locked
Not lock: 1
Not lock: 2
Not lock: 3
Unlocked
Lock: 1
Unlock: 1
Lock: 2
Unlock: 2
Lock: 3
Unlock: 3

输出显示,goroutine 能够获取其内部互斥锁,因为外部互斥锁并未阻止它们这样做。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

473

2023.08.10

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

200

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号