在ConcurrentHashMap中修改值
在ConcurrentHashMap中有分割的概念。 这意味着如果两个线程试图访问ConcurrentHashMap,它们将被分成两块,块的默认大小为16。
现在假设ConcurrentHashMap只有两个元素并且有两个不同的线程到来,并且thread1试图修改第一个值并且thread2尝试修改第二个值的场景。 在这种情况下,ConcurrentHashMap是否会进行分割?
现在,在另一种情况下,两个线程都尝试修改相同的值,ConcurrentHashMap如何处理这种情况? 通过使用锁定机制还是有其他的东西?
ConcurrentHashMap有几个桶。 密钥根据其散列值映射到其中一个存储桶中。 当您添加或检索值时,与该键关联的存储桶被锁定。
在第一个问题的情况下,有两种可能性:两个键都住在同一个桶中,或者他们住在不同的桶中。 在第一种情况下,一次只能有一个线程工作 - 第一个获取锁的人将抓住并工作,第二个线程将等待。 在第二种情况下,钥匙在不同的桶中,他们将各自获得独立的锁并同时完成他们的工作。
对于你的第二个问题,它是被锁定的桶,没有别的。 如果两个线程尝试为同一个键存储两个值,那么ConcurrentHashMap承诺两个值中的一个将与该键相关联。 即如果线程A运行map.put("Answers",2);
线程B运行map.put("Answers",10);
,那么ConcurrentHashMap将确保该映射是有效的,并且对于"Answers"
包含2
或10
,但它不会对它们中的哪一个做出任何承诺。
CHM保证这些操作(例如put
, putIfAbsent
等)不会重叠,并且这是通过锁定完成的。 每当您修改该段时,CHM的每个段都会拥有自己的锁。
(仅供参考,正如@Affe指出的那样,如果您正在修改ConcurrentHashMap
中某个值的内容,CHM不会做 - 无法做任何事情 - 以确保该线程安全。)