Thanks to visit codestin.com
Credit goes to github.com

Skip to content

单例模式导致两个同名mutex并发执行时会死锁 #2

@pkufranky

Description

@pkufranky

两个goroutine并发执行(Lock, do somthing, UnLock),使用NewMutex(name), 传入的是相同的name,因此获取的是同一个mutex

假设routine1先成功获取了redis锁,但在UnLock之前,routine2尝试Lock,就可以看到下面的死锁,都在等待localMtx的释放。
似乎单例模式没啥必要?既然名字叫NewMutex,每次返回新的就可以了

routine 1

Lock1 // 执行成功
do1 // 执行成功
UnLock1 // Lock2已经持有了内部锁localMtx,等待localMtx释放

routine 2
Lock2 // 因为routine1先获取到了redis锁,所以等待在Lock的itn.locker.lock()那行,持有了localMtx锁

func (itn *internal) Lock() {
itn.localMtx.Lock()
itn.locker.lock()
itn.localMtx.Unlock()
}

func (itn *internal) Unlock() {
itn.localMtx.Lock()
itn.locker.unlock()
itn.localMtx.Unlock()
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions