如何使用锁管理不同类型资源访问?附实现方案求正确性验证
方案正确性判定
这个实现整体是对的,完全符合你要的同步规则。
为什么能满足要求
- 同类型资源操作会串行:相同类型的资源请求,从
GetResourceTypeLockObject拿到的是同一个预先创建好的只读锁对象,lock块本身就会保证同一时间只有一个线程能进入临界区执行资源操作代码,刚好满足“同类型资源同一时间只允许一个线程执行操作”的要求。 - 不同类型资源操作可并发:不同资源类型对应的锁对象完全独立,操作不同类型资源的线程不会抢同一把锁,自然可以并行执行临界区代码,满足“不同类型资源操作可并发”的要求。
要注意的边界问题
现有逻辑能正常跑有几个前提,最好补全对应处理,不然容易踩坑:
- 所有涉及对应类型资源的操作,必须都走这个加锁流程,要是有代码绕过这个锁直接改资源,同步规则直接失效。
type1LockObject、type2LockObject、type3LockObject这三个锁对象必须是全局唯一、运行时不会被重新赋值的,要是中途被替换成新对象,不同线程拿到的锁不一样,同步就没用了。- 现在的
GetResourceTypeLockObject没处理传入未知枚举值的情况,最好加个兜底:要么直接抛参数异常,要么加个全局兜底锁,不然传个没定义的type值进去会返回null,locknull直接抛运行时错误。
原实现代码
GetResourceTypeLockObject(TypeEnum type) { if type == 1 return type1LockObject; else if type == 2 return type2LockObject; else if type == 3 return type3LockObject; } WorkOnResource(TypeEnum type) { var lockObject = GetResourceTypeLockObject(type); lock(lockObject) { // 操作对应类型的资源 } }
内容的提问来源于stack exchange,提问作者user2716454
相关产品推荐
相关产品推荐

