您的位置 首页 知识分享

Go 语言中的互斥锁:外部锁如何影响内部锁?

互斥锁在 go 中的阻塞问题 在这个代码中,虽然外部锁定了变量,但内部锁仍然可以正常使用。这是因为外部锁仅影响…

Go 语言中的互斥锁:外部锁如何影响内部锁?

互斥锁在 go 中的阻塞问题

在这个代码中,虽然外部锁定了变量,但内部锁仍然可以正常使用。这是因为外部锁仅影响同一协程内的锁操作。

代码示例:

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() }
登录后复制

输出:

Locked Not lock: 1 Not lock: 2 Not lock: 3 Unlocked Lock: 1 Unlock: 1 Lock: 2 Unlock: 2 Lock: 3 Unlock: 3
登录后复制

解释:

在输出中,我们可以看到:

  • 外部锁(mutex.lock())在 “locked” 后立即被加锁。
  • 三个协程在 “not lock: n” 后执行代码,说明此时外部锁并未影响内部锁。
  • 随后,外部锁(mutex.unlock())在 “unlocked” 后被解锁,这也是外部锁对内部锁的影响结束的时刻。
  • 三个协程随后在 “lock: n” 后被依次加锁,说明内部锁在外部锁解锁后才生效。

因此,我们可以得出结论:

  • 在 go 中,不同的协程中的互斥锁是独立的。
  • 外部锁只会影响同一协程中的内部锁操作。

以上就是Go 语言中的互斥锁:外部锁如何影响内部锁?的详细内容,更多请关注php中文网其它相关文章!

本文来自网络,不代表甲倪知识立场,转载请注明出处:http://www.spjiani.cn/wp/5003.html

作者: nijia

发表评论

您的电子邮箱地址不会被公开。

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@wangzhan.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部