原创分享 实现了一个并发安全的 set,各位大佬看看有没有问题

xmge-github · 2020年04月16日 · 最后由 foxhack 回复于 2020年04月23日 · 567 次阅读
package main

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

type threadSafeSet struct {
    sync.RWMutex
    data map[interface{}]interface{}
}

func (set *threadSafeSet)Add(item interface{})  {
    // map is not safe in concurrency
    set.Lock()
    set.data[item] = true
    set.Unlock()
}

func (set *threadSafeSet)Remove(item interface{})  {
    set.Lock()
    delete(set.data,item)
    set.Unlock()
}

func (set *threadSafeSet) Iter() <-chan interface{} {
    ch := make(chan interface{})
    go func() {
        set.RLock()
        for item,_ := range set.data {
            ch <- item
        }
        close(ch)
        set.RUnlock()

    }()
    return ch
}

func main() {
    set := new(threadSafeSet)
    set.data = make(map[interface{}]interface{})
    for i:=0;i<10 ;i++  {
        set.Add(i)
    }

    for item := range set.Iter(){
        fmt.Printf("get value from set,value is %v\n",item)
    }

    time.Sleep(5 * time.Second)
}
更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

Iter 方法里用了阻塞的 chan,加上用了协程处理,同时也有锁,在高并发的情况可能会出现大量的 go 协程阻塞,饿死吧

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册