分布式锁知道哪些?用channel如何实现?

本文阅读 1 分钟
首页 golang 正文
题目序号:(659)
题目来源:网易
频次:1

答案1:(呼哈)

分布式锁定义-控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。
通过数据库,redis,zookeeper都可以实现分布式锁。其中,最常见的是用redis的setnx实现。
通过channel实现:

package main
import ("sync") 

// Lock
type Lock struct {
    c chan struct{}
}

// NewLock
func NewLock() Lock {
    var l Lock
    l.c = make(chan struct{}, 1)
    l.c <- struct{}{}
    return 
}

// Lock, return lock result
func (l Lock) Lock() bool {
    lockResult := false
    select {
        case <-l.c:
        lockResult = true
        default:
    }
    return lockResult
}

// Unlock 
func (l Lock) Unlock() {
    l.c <- struct{}{}
}

var counter int

func main() {
    var l = NewLock()
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            if !l.Lock() {
                // log error
                println("lock failed")
                return
            }
            counter++
            println("current counter", counter)
            l.Unlock()
        }()
    }
    wg.Wait()
}

总结:通过channel作为媒介,利用struct{}{}作为信号,判断struct{}{}是否存在进行加锁、解锁操作。

本文来自投稿,不代表本站立场,如若转载,请注明出处:
syncpool的实现原理
« 上一篇 09-17
问了sync.Map(我说我对sync.Pool比较熟,就说Pool了)
下一篇 » 09-17

发表评论

发表评论