我对Java中的ConcurrentHashMap有个疑问。它在内部调用readValueUnderLock。为什么在获得操作的情况下需要锁定。在这种情况下,这种情况将是真的 (Entry.value == null) 这会导致readValueUnderLock被调用)为什么ConcurrentHashMap中的方法阻塞?
4
A
回答
0
为了从哈希映射中读取值,代码必须首先找到值。如果另一个线程在第一个线程正在查找该值时添加了一个值,则可能会导致搜索失败。从本质上讲散列图可以这样做:
calculate hash
go to location hash in the array
look to see if there's a list
iterate through the list until value is found
如果这个名单是说一个数组列表和其它线程需要调整它的大小,这将是该线程通过它遍历一个大问题。
4
从readValueUnderLock
/**
* Reads value field of an entry under lock. Called if value
* field ever appears to be null. This is possible only if a
* compiler happens to reorder a HashEntry initialization with
* its table assignment, which is legal under memory model
* but is not known to ever occur.
*/
源代码的Java文档注释从这个link
不太。你是对的,它永远不应该被称为。 然而,JLS/JMM可以作为阅读不是绝对 被调用,因为在决赛中所需的排序关系弱点 的 VS在构造函数设置挥发禁止它(关键是最终的,价值是 挥发),WRT的读取由线程使用 条目对象。 (在JMM-ese中, 决赛的排序限制不在同步关系之外。) 这是doc评论(以下粘贴)引用的问题。 没有人想过处理器/编译器可能会发现产生空值读取的实际漏洞, ,并且可以证明没有任何漏洞存在(也许有一天,JLS/JMM修订版将填补空白以阐明这个), 但是比尔·普格曾经建议我们为了保守地迂回正确而将它放在了 之内。 回想起来,我不太确定这是一个好主意,因为 它导致人们想出奇特的理论。
相关问题
- 1. 为什么concurrent_queue非阻塞?
- 2. 为什么ioctl()不阻塞?
- 3. 为什么glClear在OpenGLES中被阻塞?
- 4. BlockingQueue阻塞的方式是什么?
- 5. 为什么这个异步方法阻塞UI线程?
- 6. 为什么Thread.Start方法在CPU负载过高时被阻塞?
- 7. PHP flock()非阻塞仍然阻塞为什么?
- 8. 读FIFO:为什么会阻塞然后非阻塞
- 9. 为什么select()始终在非阻塞模式下被阻塞
- 10. 我为什么要使用非阻塞或阻塞套接字?
- 11. Python:为什么recv()在阻塞模式下没有阻塞?
- 12. Java阻塞问题:为什么JVM会阻塞许多不同类/方法中的线程?
- 13. 为什么我的锁不会阻塞?
- 14. 阻塞信号的行为是什么?
- 15. Scala中的非阻塞和阻塞未来是什么?
- 16. 为什么ConcurrentHashMap :: putIfAbsent比ConcurrentHashMap :: computeIfAbsent更快?
- 17. gae中的lease_tasks()是否阻塞了一个阻塞方法?
- 18. 的ObservableCollection方法Add()阻塞
- 19. 为什么Console.WriteLine()阻塞从Stream.ReadAsync()回调?
- 20. 为什么system32 ntoskrnl.exe阻塞端口80?
- 21. 为什么Task.Factory.FromAsync阻塞UI线程?
- 22. 为什么Antlr4会阻塞LT!*
- 23. 为什么Javascript函数不能阻塞?
- 24. 为什么Handler.Post阻塞主线程
- 25. 为什么这个socket.recv()阻塞?
- 26. 为什么WaitForSingleObject(INVALID_HANDLE_VALUE,INFINITE)阻塞?
- 27. 为什么IE阻塞({function:1} [typeof somefunc])?
- 28. telnet连接inputstream阻塞为什么?
- 29. 这个goroutine为什么会阻塞?
- 30. 为什么Crawler4j非阻塞方法没有等待队列中的链接?
但不知道如何HashEntry初始化可以重新排序与它的表分配,我想了解在哪个条件中键不会为空,值可能为空,从Java文档它似乎也不知道曾经发生过,那么为什么他们包括这种方法来锁定(因为HashEntry是有效的免除所有字段是最终的,除了易变的值) – tarunk
@tarunk从javadoc看起来它是为特殊情况写的。 –
是的,任何关于这种特殊情况的想法,它是如何发生的,因为jsr 133提供了对最终/易失变量进行排序的保证。 – tarunk