我想知道当我们在调整大小时尝试读取ConcurrentHashMap时可能出现的情况。
我知道在读取过程中,第一次尝试总是不同步的。在第二次尝试中,它将尝试获取锁定并重试。
但是如果在调整大小期间发生它会如何工作?
由于
答案 0 :(得分:5)
通过观察来源:
ConcurrentHashMap包含一个或多个段,具体取决于并发级别。
在重新散列期间,一个段被锁定,新表在旧表旁边构建,然后在最后替换它。
如果您在重新划分某段时调用get()
并且您的密钥存储在该段中,您将无锁地访问该段的旧表,如果找到并且该值不为空,则它将是回。如果该值为null,则调用将阻塞,直到重新散列完成,并且将在锁定下再次读取该值。