美文网首页
golang-互斥锁 sync.Mutex

golang-互斥锁 sync.Mutex

作者: 爱吃豆包 | 来源:发表于2019-12-18 11:02 被阅读0次

互斥量(锁) 在go语言里面很少用,但是也提供支持 !

互斥量的概念!go语言提供的锁:Mutex (sync.Mutex)

go 语言提供了原子类型的操作,在 sync/atomic 包下
比如 atomic.AddInt32() 就是累加操作, go 语言提供的
累加操作,就算多个协程同时累加,也是安全,优先使用 go 语言提供的!

在这里手动实现一个互斥量, 用来实现 累加操作

package main

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

/**
    互斥量的概念!go语言提供的锁:Mutex (sync.Mutex)

    // go 语言提供了原子类型的操作,在 sync/atomic 包下
    // 比如 atomic.AddInt32() 就是累加操作

    累加操作,就算多个协程同时累加,也是安全,优先使用 go 语言提供的!


    在这里手动实现一个互斥量, 用来实现 累加操作

*/

/**
由于 会出现我在写的时候,另一个人却在读,导致冲突, 所以进行改写
 */
// 声明一个 int 类型
// type atomicInt int

// 获取值
//func (a *atomicInt) get() int {
//  // 返回值,包装一下,就不会返回地址
//  return int(a)
//}

/**
    改写后
 */

type atomicInt struct {
    value int
    lock sync.Mutex // 互斥锁, 也就是我正在操作的时候,我排斥其他人操作
}

// 加一 操作
func (a *atomicInt) increment() {
    // 在写的时候,进行上锁保护, 防止读写冲突
    a.lock.Lock()
    // 释放锁, 执行完毕后我就释放锁
    defer a.lock.Unlock()
    a.value ++

}

// 获取值
func (a *atomicInt) get() int {
    // 返回值,包装一下,就不会返回地址
    // 上锁
    a.lock.Lock()
    // 释放锁, 读完后我释放锁
    defer a.lock.Unlock()
    return a.value
}

func main() {
    var a atomicInt
    a.increment()
    go func() {
        a.increment()
    }()

    /**
        这个时候会有一个问题,就是我 a 正在写的时候,另一个却正在读这个 a,导致冲突!
        改写后就解决了这个问题!
     */

    time.Sleep(time.Millisecond)
    fmt.Println(a.get())


}

相关文章

  • golang-互斥锁 sync.Mutex

    互斥量(锁) 在go语言里面很少用,但是也提供支持 ! 互斥量的概念!go语言提供的锁:Mutex (sync.M...

  • Go超时锁的设计和实现

    Go提供两种锁:sync.Mutex和sync.RWMutex。 sync.Mutex: 互斥锁。任意时刻,只能有...

  • go-day5

    sync包 sync.Mutex 互斥锁 适用于并发访问公共资源的场景。 声明互斥锁 使用互斥锁 sync.RWM...

  • Golang同步相关知识总结

    锁 1.互斥锁表示:sync.Mutex,类型sync.Mutex的零值表示了未被锁定的互斥量作用:保证在同一时刻...

  • go 中的 sync.Mutex 与 sync.RWMutex

    sync.Mutex 互斥锁,不支持递归锁 sync.RWMutex 什么时候用sync.Mutex,什么时候用 ...

  • Golang学习笔记-sync

    Mutex sync.Mutex为互斥锁,同一时间只能有一个goroutine获得互斥锁。 使用Lock()加锁,...

  • golang 互斥锁 sync.Mutex

    一、介绍sync.Mutex为互斥锁(也叫全局锁),Lock()加锁,Unlock()解锁。 二、场景适用于场景:...

  • Go 并发之互斥锁

    在 Go 语言中使用sync.Mutex 来实现互斥锁,示例代码如下: 输出结果为:

  • go 锁的使用

    锁 互斥锁 由标准库代码包sync中的Mutex结构体类型代表,sync.Mutex类型(确切地说,是*sync...

  • Golang学习笔记之互斥锁(Mutex)

    Go语言包中的sync包提供了两种锁,互斥锁(sync.Mutex)和读写锁(sync.RWMutex) 这一篇博...

网友评论

      本文标题:golang-互斥锁 sync.Mutex

      本文链接:https://www.haomeiwen.com/subject/stmenctx.html