go互斥锁Mutex

互斥锁

  • 互斥锁的是控制共享资源进行访问的主要手段,目的是来保证在同一时刻只有一个线程对该对象进行访问。类似于开箱关箱子
    image.png
  • golang中提供了一个sync.Mutex类型,并提供了一个Lock和UnLock方法,含义于图中相似。

下面是测试互斥锁的使用

package main

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

var m *sync.Mutex
var goruntimeWaitGroup sync.WaitGroup

func main() {
    m = new(sync.Mutex)
    goruntimeWaitGroup.Add(1)
    go Worker(1, 5)
    goruntimeWaitGroup.Add(1)
    go Worker(2, 1)
    goruntimeWaitGroup.Add(1)
    go Worker(3, 1)
    goruntimeWaitGroup.Add(1)
    go Worker(4, 1)
    goruntimeWaitGroup.Add(1)
    go Worker(5, 3)
    goruntimeWaitGroup.Wait()
    fmt.Println("main Exit")
}

func Worker(i int, workerTime time.Duration) {
    defer goruntimeWaitGroup.Done()
    fmt.Println(i, "worker start")
    fmt.Println(i, "worker in lock")
    m.Lock()
    defer fmt.Println(i, "unlock")
    defer m.Unlock()
    fmt.Println("worker runing")
    time.Sleep(workerTime * time.Second)
}

运行结果:

4 worker start
4 worker in lock
worker runing
2 worker start
2 worker in lock
5 worker start
5 worker in lock
1 worker start
1 worker in lock
3 worker start
3 worker in lock
4 unlock
worker runing
2 unlock
worker runing
5 unlock
worker runing
1 unlock
worker runing
3 unlock
main Exit

解读:

  • 互斥锁需成对出现,可以运用defer防止中间return,忘记写unclock造成死锁。
  • 可以验证互斥锁的作用会保护共享资源,使同一时刻只有一个对象访问。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 临界区 1.1简介 在早期计算机系统中,只有一个任务进程在执行,并不存在资源的共享与竞争。随着技术和需求的飞速...
    Fly晴天里Fly阅读 9,079评论 2 13
  • 引用自多线程编程指南应用程序里面多个线程的存在引发了多个执行线程安全访问资源的潜在问题。两个线程同时修改同一资源有...
    Mitchell阅读 2,025评论 1 7
  • 接着上上节 thread ,本节主要介绍mutex的内容,练习代码地址。<mutex>:该头文件主要声明了与互斥量...
    jorion阅读 12,573评论 2 4
  • 在上篇中,我们已经讨论过如何去实现一个 Map 了,并且也讨论了诸多优化点。在下篇中,我们将继续讨论如何实现一个线...
    一缕殇流化隐半边冰霜阅读 7,695评论 5 41
  • 当没有真正的尊敬的时候,当你不尊重别人的时候,不管他是你的仆人还是你的朋友,就没有爱存在。你难道没有注意过,对你的...
    楚浛阅读 774评论 3 4