我懷疑理解同步散列表。如果一段conc hashmap被一個編寫器線程鎖定,那麼讀者線程是否可以同時讀取同一段hashmap映射?還是它需要鎖從寫入程序線程釋放?在併發散列表中讀寫
-1
A
回答
0
0
如果你看看ConcurrentHashMap.get()的源代碼,那麼你可以很容易地理解它。
無鎖而從併發地圖閱讀,但如果該值null
它在readValueUnderLock
get(Object key, int hash) {
if (count != 0) { // read-volatile
HashEntry<K,V> e = getFirst(hash);
while (e != null) {
if (e.hash == hash && key.equals(e.key)) {
V v = e.value;
if (v != null)
return v;
return readValueUnderLock(e); // recheck
}
e = e.next;
}
}
return null;
}
readValueUnderLock(HashEntry<K,V> e) {
lock();
try {
return e.value;
} finally {
unlock();
}
}
看那ConcurrentHashMap.put()方法再次檢查以及首先調用lock()
最後需要調用unlock()
put(K key, int hash, V value, boolean onlyIfAbsent) {
lock();
try {
...
} finally {
unlock();
}
}
相關問題
- 1. 使用併發散列表
- 2. 併發讀寫
- 3. 在散列表中重寫數據
- 4. 併發讀寫lucene
- 5. 併發讀寫NamePipeClientStream
- 6. Lucene併發讀寫
- 7. 從表中讀取數據到散列
- 8. 併發鏈接列表讀寫器不能正常工作
- 9. 使用讀寫鎖定的pthreads散列表中的讀取性能差
- 10. Actionscript讀取XML並寫入列表中寫入
- 11. 併發讀寫文件
- 12. 併發文件讀寫
- 13. 讀寫器併發性
- 14. 散列表和散列表
- 15. c:讀取/寫入散列表到文件
- 16. 在python中讀寫zip列表
- 17. Java中併發讀取/寫入變量
- 18. Java中的併發讀/寫文件
- 19. MongoDB:正在讀/寫數據庫併發?
- 20. haskell中的並行散列表
- 21. WCF中的字典發回散列表
- 22. 閱讀文件列表,並重新寫入主列表
- 23. 併發映射在沒有併發時進行讀寫
- 24. 寫散列哈希
- 25. 爲什麼不能在散列表中存儲散列表?
- 26. Ruby修改並在散列數組中添加散列值
- 27. 在MySQL上併發讀取和寫入表
- 28. 持久散列映射,併發JDBM
- 29. 併發問題和散列圖
- 30. 如何讀取文件,拆分它中的字符串,並將輸出寫入C#中的散列表?
你問*關於*使用ConcurrentHashMap或關於它如何實現*? – assylias
閱讀['ConcurrentHashMap' Javadoc]的前兩段(https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html)。其實,全部閱讀。 – Tomas
@Tomas 100%正確 – Braj