我听说这channel比sycn.Mutex.Lock()您的程序具有高并发性时要好。但是为什么渠道更有效率呢?在我看来,要实现一个安全的缓冲池(我认为通道可以被认为是一个缓冲池),你必须使用锁。


如果channel效率更高,为什么会有sycn.Mutex?因为我可以编写下面的代码来模拟sync.Mutex.


type seme struct {

    lock chan int

    locked bool

}



func (l *seme)Lock() {

// state 0 for initial, 1 for locked, 2 for free.

    if atomic.CompareAndSwapInt32(&l.state, 0, 1) {

        l.lock = make(chan int, 1)

    }

    l.lock <- 0

    l.state = 1

}


func (l *seme)UnLock() {

    if !atomic.CompareAndSwapInt32(&l.state, 1, 2)  {

        panic("UnLock a free Lock")

    }

    l.state = 2

    <- l.lock

}

如果channel到处都比mutex,我为什么要使用mutex?也就是说,我应该什么时候使用mutex而不是channel?有人可以给我一个例子吗?