golang:使用channel实现互斥锁

golang中使用channel实现互斥锁

通过将带有一个缓冲区的channel作为一个桶,桶中的数据作为锁,每次要访问临界区的goroutine要首先拿到桶里的锁,以此来达到同步访问。

package main

import (
    "fmt"
    "runtime"
    "sync"
)

var counter int

type Lock struct {
    ch chan struct{}
}

func NewLock() *Lock {
    return &Lock{
        ch: make(chan struct{}, 1),
    }
}

func (t *Lock) Lock() {
    <-t.ch
}

func (t *Lock) Unlock() {
    t.ch <- struct{}{}
}

func add(n int) {
    tmp := counter
    tmp += n
    counter = tmp

}

func main() {
    wg := sync.WaitGroup{}
    wg.Add(100000)
    t := NewLock()
    t.ch <- struct{}{}

    for i := 0; i < 100000; i++ {
        go func(j int) {
            t.Lock()
            defer t.Unlock()
            add(j)
            wg.Done()
        }(i)
    }

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

推荐阅读更多精彩内容

  • 最近开发遇到一个问题,如果一个UICollectionView需要等分屏幕时,有些情况会出现缝隙的情况。 这个原因...
    alpha_feng阅读 2,358评论 0 7
  • 在歌曲《那些花儿》的单曲循环中完成。 脑袋处于放空状态,一个人,静静地,真好~
    离离诗画阅读 442评论 0 2
  • 可能这篇话语有点自私,因为我实在组织不起来任何台面上的话语。只是一场考试。 是啊,只是一场考试。 一场没有较量的考...
    郭大胆LYX阅读 255评论 0 2
  • 其实每一天你都可以进步 少说几句没用的话 多看书 这么一上来就带着教育的语气 那真不是我 在码头倒数 与繁星共眠 ...
    曹林杰阅读 344评论 0 0