对于sync.Mutex使用注意事项

1.sync.Mutex的初始化注意事项

type MemProvider struct {
lock     *sync.Mutex              //用来锁
sessions map[string]*SessionStore //用来存储在内存
}

初始化时

var lockm *sync.Mutex = new(sync.Mutex)
var memProvider = &MemProvider{sessions: make(map[string](*SessionStore)), lock: lockm}


2.sync.Mutex的嵌套调用注意事项

func (per *MemProvider) SessionInit(sid string) (Session, error) {
per.lock.Lock()
defer per.lock.Unlock()
v := make(map[interface{}]interface{})
fmt.Println("provider init session")
newSess := &SessionStore{sid: sid, timeAccessed: time.Now(), values: v}
per.sessions[sid] = newSess
fmt.Println("provider init finish")
return newSess, nil
}
func (per *MemProvider) SessionRead(sid string) (Session, error) {
per.lock.Lock()
defer per.lock.Unlock()
if sess, ok := per.sessions[sid]; ok {
return sess, nil
} else {
sess, err := per.SessionInit(sid)
return sess, err
}
return nil, nil
}

在SessionRead(sid string)函数中,

当出现per.sessions[sid]中不存在sess时,此时会执行sess.err:= per.SessionInit(sid)函数

在SessionInit(sid string)函数中,首行就出现

per.lock.Lock()
defer per.lock.Unlock()

这就需要per.lock此时属于被释放状态,而在SessionRead(sid string)中调用per.SessionInit(sid)时,此时上一步执行的lock仍然处于lock状态

改进后的代码如下

func (per *MemProvider) SessionInit(sid string) (Session, error) {
per.lock.Lock()
defer per.lock.Unlock()
v := make(map[interface{}]interface{})
newSess := &SessionStore{sid: sid, timeAccessed: time.Now(), values: v}
per.sessions[sid] = newSess
return newSess, nil
}
func (per *MemProvider) SessionRead(sid string) (Session, error) {
per.lock.Lock()
if sess, ok := per.sessions[sid]; ok {
per.lock.Unlock()
return sess, nil
} else {
per.lock.Unlock()
sess, err := per.SessionInit(sid)
return sess, err
}
per.lock.Unlock()
return nil, nil
}

此时,锁问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值