1.为什么hashMap会抛出ConcurrentModificationException.
因为hashMap有modCount属性,每被修改一次,modCount会自增。当调用hashMap的keySet的iterator()时,hashMap内部实现的HashIterator会记录当时的modCount,循环时,会先比较modCount与HashIterator记录的modCount是否一致,如果不一致则抛出ConcurrentModificationException。
ConcurrentHashMap则不会抛出异常,如果循环ConcurrentHashMap中的segment时发生了修改,被修改的是已循环的segment,则对循环结果不会有影响,被修改的是未循环的segment,则循环结果会显示为修改后的。因为segment中保存数据的HashEntry数组是volatile的。
2.为什么ConcurrentHashMap的get方法不用加锁。
ConcurrentHashMap能保证put()之后,立马能被get()读取到。但put()执行中,则不一定能被get()读取到,是弱一致性的。弱一致性具体的内容我还没看懂,其他高手解答。