golang 无缓存channel实现原子锁

用一个缓存空间的channel实现锁比较简单,如果是无缓存就会稍微麻烦点
直接上代码了:

package samples

type Mutex struct {
    m chan struct{}
}

func NewMutex() *Mutex {
    m :=  &Mutex{
        m: make(chan struct{}),
    }

    go m.run()
    return m
}

func (m *Mutex) Lock() {
    m.m <- struct{}{}
}

func (m *Mutex) Unlock() {
    <-m.m
}

func (m *Mutex) run() {
    for {
        select {
        case <- m.m:
            m.m <- struct{}{}
        }
    }
}

以下是sample:

package main

import (
    "fmt"
    "sync"
    "sample/samples"
)

func main() {
    m := samples.NewMutex()
    var n int

    var w sync.WaitGroup
    w.Add(10000)
    for i := 0; i < 10000; i++ {
        go func() {
            m.Lock()
            n ++
            m.Unlock()
            w.Done()
        }()
    }

    w.Wait()
    fmt.Println(n)
}

欢迎留言沟通交流

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容