我了解了hashMap及其与hashtable的区别。像在哈希表中一样,整个对象被锁定,而在并发哈希表的情况下,只有一部分被锁定。我的问题是,当两个线程在samme时刻尝试访问与键对应的相同值时,会发生什么情况。
可以说
Map mp = new ConcurrentHashMap();
mp.put(1, "Hello");
线程1:尝试读取mp.get(1)。
线程2:尝试向其中写入/修改mp.put(1,“ Hi”)。
那么线程1读取什么值?
编辑:我的意思是ConcurrentHashMap。
线程1读取什么值?
它将读取两个可能的值,或者
null
因为尚未设置该值,所以它会得到。这听起来似乎没什么大不了,但您应该注意,HashMap
这样做有可能进入无限循环而永不返回,这很糟糕。
哪里ConcurrentHashMap
是真正有用的是在这样的操作putIfAbsent
对于在线程之间传递的工作,一个队列是更好的选择。
ConcurrentMap<Integer, BlockingQueue<String>> map = ...
线程1
String value = map.putIfAbsent(1, k -> new BlockingQueue<>()).take();
线程2
map.putIfAbsent(1, k -> new BlockingQueue<>()).offer("Hi");
在这种情况下,线程1将阻塞,直到线程2添加了一个值。注意:此值仅可用一次。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句