使用同一把锁保护不同临界区是否可行?有哪些潜在风险?
多临界区共用同一把锁的可行性说明
结论
你当前的写法完全可行,没有逻辑错误。
同一把锁可以用来保护多个独立的临界区,只要这些临界区访问的共享资源需要互斥访问,共用锁的设计是合法的。你将x = y放在循环外的实现也合理,既规避了循环内重复执行无意义赋值的开销,也不会引发同步问题。
注意事项
- 必须保证所有访问共享变量
x和myVar的线程,都持有同一把writeLock做同步:如果你用的是读写锁,读操作可以加读锁、写操作加写锁,绝对不能有线程绕过锁直接读写这两个变量,否则还是会出现数据竞争。 - 当前手动加锁解锁的实现不是异常安全的:如果临界区内的代码(赋值操作、中间省略的逻辑)抛出异常,会导致
writeLock.unlock()无法执行,锁被永久持有引发死锁。建议改用对应语言的自动锁守卫机制,比如C++中的std::lock_guard、Java中的try-with-resources语法,退出作用域时自动释放锁,避免人为疏漏。 - 如果后续
x和myVar的访问完全独立、没有关联互斥要求,也可以拆分为两把独立的锁降低锁粒度,提升并发性能,但当前场景下共用一把锁没有功能问题,是否拆分取决于你对并发性能的要求。
内容的提问来源于stack exchange,提问作者spooja__
相关产品推荐
相关产品推荐

