ReadWriteLock 接口詳解
ReadWriteLock 接口詳解
這是本人閱讀ReadWriteLock接口源碼的注釋後,寫出的一篇知識分享博客
讀寫鎖的成分是什麼?
- 讀鎖 Lock readLock();
- 只要沒有寫鎖,讀鎖可以被多個線程同時擁有
- 寫鎖 Lock writeLock();
- 寫鎖是獨佔的
所有讀寫鎖的實現,都必須保證:寫鎖的內存同步效果也應該適用於讀操作,也就是說,一個獲取讀鎖的線程 應該可以看到上一個寫鎖所做的所有更新
讀寫鎖與互斥鎖的優劣比較
- 相比較於互斥鎖,讀寫鎖 在什麼情況下 具有更高的性能呢?
- 這取決於數據被讀取的頻率 ,讀和寫操作的持續時間,存取數據的衝突
- 也可以說是,同時讀寫數據的線程的數量
- 例如:一個集合的數據被初始化之後,就很少再修改,然而被頻繁的查找,這就是一個讀寫鎖的理想的使用情況。
- 那什麼時候不適合用讀寫鎖呢?
- 如果更新數據變得頻繁,那麼數據大部分時間被獨佔,使用讀寫鎖 並發性幾乎沒有增加。
- 此外,如果讀操作花費的時間很短,那麼讀寫鎖實現 所造成的消耗(讀寫鎖本質上比互斥鎖更複雜)會主導執行成本,尤其是
當讀寫鎖的實現 仍然通過一小段代碼序列化所有線程時。
- 最終,只有分析和測量才能評價一個讀寫鎖是否適合你的應用程序。
讀寫鎖的實現必須要做的決策
- 在一個寫操作釋放寫鎖時,同時有寫操作和讀操作在等待,確定授予讀鎖還是寫鎖。
- 優先寫操作較多,因為寫操作一般是短的、不頻繁的。
- 優先讀操作較少,因為如果讀操作是頻繁的、時間長的,會導致寫操作的長時間等待
- 當一個讀操作是活躍的,寫操作在等待時,一個讀操作請求讀鎖,確定是否授予讀鎖。
- 優先讀操作會無限期的推遲寫草所
- 優先寫操作會減少並發的可能性
- 確定鎖是否可重入
- 一個擁有寫鎖的線程能否重複獲取它?
- 擁有寫鎖時,能否獲取讀鎖?
- 讀鎖可以再次獲取嗎?
- 寫鎖可以降級為讀鎖,而不允許插入寫操作嗎?
- 讀鎖可以升級為寫鎖,並優先於其他正在等待的讀操作和寫操作嗎?