golang加锁与解锁

package main

import (
    "sync"
)

var m sync.RWMutex

func main() {

    list := []int{1, 2, 3, 4, 5, 6}
    for _, item := range list {
        read(item)
        write(item)
    }
}

func read(i int) {

    m.RLock()

    if i > 2 {
        return
    }

    m.RUnlock()
}

func write(i int) {
    m.Lock()
    print("args:", i)
    m.Unlock()
}

结果:all goroutines are asleep - deadlock!

分析: 如果程序中途有结束操作,不会释放锁,

方案:

1、必须保证中途没有结束或者break操作

2、下列方式可以预防,在func结束后释放锁:

m.RLock()
defer m.RUnlock()

猜你喜欢

转载自www.cnblogs.com/therhub/p/11232467.html