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)
}

欢迎留言沟通交流

你可能感兴趣的:(golang 无缓存channel实现原子锁)