通过异步基于密钥的锁定改进并发对象访问
本文使用 ImageProcessor 库中的哈希 URL 键来解决并发对象锁定问题。 库在缓存更新期间遇到间歇性文件访问错误。 事实证明,为基于密钥的异步锁定而设计的自定义 AsyncDuplicateLock
类是不够的。
分析 AsyncDuplicateLock
类
AsyncDuplicateLock
类提供同步 (Lock
) 和异步 (LockAsync
) 锁定方法。两者都利用钥匙来识别锁定的对象。
锁定机制
锁定过程涉及以下基于密钥的步骤:
Wait
(同步)或WaitAsync
(异步)来获取锁。Release
(同步)或异步方式释放信号量。找出问题
原始代码的缺陷在于过早地从 SemaphoreSlim
中删除 ConcurrentDictionary
实例。 这种在信号量释放之前过早的处置会导致多个信号量与同一键关联,从而导致缓存添加错误。
增强实施
我们的解决方案为字典中的每个信号量引入了引用计数。 单个锁可确保原子递减和引用计数的删除。这种增强的方法提供了强大的锁定并防止以前的错误。
这种改进的实现实现了可靠的基于密钥的异步锁定,最大限度地减少了缓存错误并确保 ImageProcessor 库功能正确。
以上是基于密钥的异步锁定如何改进并发对象访问并防止缓存错误?的详细内容。更多信息请关注PHP中文网其他相关文章!