透過非同步基於密鑰的鎖定改進並發物件存取
本文使用 ImageProcessor 庫中的雜湊 URL 鍵來解決並發物件鎖定問題。 庫在快取更新期間遇到間歇性文件存取錯誤。 事實證明,為基於密鑰的非同步鎖定而設計的自訂 AsyncDuplicateLock
類別是不夠的。
分析 AsyncDuplicateLock
類別
AsyncDuplicateLock
類別提供同步 (Lock
) 和非同步 (LockAsync
) 鎖定方法。兩者都利用鑰匙來識別鎖定的物件。
鎖定機制
鎖定過程涉及以下基於密鑰的步驟:
Wait
(同步)或WaitAsync
(非同步)來取得鎖定。 Release
(同步)或非同步方式釋放訊號量。 找出問題
原始程式碼的缺陷在於過早從 SemaphoreSlim
中刪除 ConcurrentDictionary
實例。 這種在信號量釋放之前過早的處置會導致多個信號量與同一鍵關聯,從而導致快取添加錯誤。
增強實作
我們的解決方案為字典中的每個信號量引入了引用計數。 單一鎖定可確保原子遞減和引用計數的刪除。這種增強的方法提供了強大的鎖定並防止先前的錯誤。
這種改進的實現實現了可靠的基於密鑰的非同步鎖定,最大限度地減少了快取錯誤並確保 ImageProcessor 庫功能正確。
以上是基於金鑰的非同步鎖定如何改善並發物件存取並防止快取錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!