在下面的代码中,我如何区分 gloabllock 和 entrylock 以及它到底锁定什么
type cacheImpl struct {
globalLock sync.Mutex
EntryLock map[string]*sync.Mutex
abc map[string]int
}
我希望entrylock只锁定与该key对应的一个int条目。但这个参考是如何创建的。
我想说你对此的思考方式是有缺陷的:互斥锁本身不会锁定任何其他东西。通过扩展,当我们说特定的互斥锁保护某个特定的变量(或一组变量)时,我们暗示这种情况发生在凭借所有可能的代码路径访问该变量(或该集合)一致地使用该互斥体。
换句话说,互斥体本身只是一个同步原语,它实现了调用其Lock
方法的特定规则:只要互斥体被锁定,对其
Lock
方法的任何调用都会挂起调用 Goroutine,直到互斥体被锁定。解锁,之后每个当前挂起的调用 goroutine 都会醒来并“重试”锁定互斥体,只有其中一个成功。因此,要使互斥锁有用,您必须将其与您自己实现的特定工作流程结合起来。
我不太清楚你的问题,但如果你打算在
EntryLock
中创建互斥体来管理对
abc
中相同键条目的访问,那么你可以像这样滚动:
globalLock
;
abc
添加条目;
EntryLock
添加条目 – 这可能看起来就像
EntryLock[theKey] = new(sync.Mutex)
;
globalLock
。
globalLock
;
EntryLock[theKey
];
abc[theKey]
;
EntryLock[theKey]
;
globalLock
。
globalLock
的同时从两个地图中删除项目。
globalLock
条目,您也必须
按住
abc
。 如果你同意某些 Goroutine 同时从地图中删除“锁定的条目”,你可以这样做
globalLock
;
EntryLock[theKey
];
globalLock
。请注意,现在任何其他 goroutine 都可能会在您使用
abc[theKey]
和
EntryLock[theKey]
时删除它们;
abc[theKey]
;
EntryLock[theKey]
;