Java中的Map【四】ConcurrentMap接口

港控/mmm° 2021-09-20 23:20 841阅读 0赞

所使用的jdk版本为1.8版本,先看一下ConcurrentMap在JDK中Map的UML类图中的位置:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIyMDc2MzQ1_size_16_color_FFFFFF_t_70

2.1.4 ConcurrentMap接口

ConcurrentMap接口继承Map接口,是一种提供线程安全性和原子性保证的Map。分析一下里面的方法:

1、非default方法:

  1. V putIfAbsent(K key, V value);
  2. boolean remove(Object key, Object value);
  3. boolean replace(K key, V oldValue, V newValue);
  4. V replace(K key, V value);

这四个方法在Map接口中均有定义,并且都是default方法。在ConcurrentMap中因为这些方法需要保证多线程下的原子性,因此需要实现类具体实现,在ConcurrentMap中都是abstract方法。

2、重写Map中的default方法

(1)default V getOrDefault(Object key, V defaultValue)

  1. default V getOrDefault(Object key, V defaultValue) {
  2. V v;
  3. return ((v = get(key)) != null) ? v : defaultValue;
  4. }
  5. Map中的方法不同的是,没有进行containsKey(key)这一步的判断。此实现假定ConcurrentMap不能包含null作为value值,而get(key)返回null明确表示key不存在。所以如果支持null作为value值的实现类,必须重写此默认实现。

(2)default void forEach(BiConsumer<? super K, ? super V> action)

  1. @Override
  2. default void forEach(BiConsumer<? super K, ? super V> action) {
  3. Objects.requireNonNull(action);
  4. for (Map.Entry<K, V> entry : entrySet()) {
  5. K k;
  6. V v;
  7. try {
  8. k = entry.getKey();
  9. v = entry.getValue();
  10. } catch(IllegalStateException ise) {
  11. // this usually means the entry is no longer in the map.
  12. continue;
  13. }
  14. action.accept(k, v);
  15. }
  16. }

与Map中的方法实现一致。传入函数式接口,用于遍历Map。

(3)default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)、

  1. default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)等方法默认实现与Map中有所不同,当多个线程尝试更新(包括可能多次调用方法)时,默认实现可能会重试这些步骤,里面有一个for(;;)结构体(比较简单,注释清楚)。具体的实现类如ConcurrentHashMap都根据内部结构重写了以上方法,后续再具体实现分析。

发表评论

表情:
评论列表 (有 0 条评论,841人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java集合之Map接口()

    Map接口 1.将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 2.此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口

    相关 javaMap接口

    java中的Map接口 实现Map接口的类用来存储——键值对 Map接口的实现类有HashMap和TreeMap等 键值不能重复(键相当与索引)  TestMap.

    相关 Java ConcurrentMap 接口

    Java ConcurrentMap 接口 Java 集合框架的ConcurrentMap接口提供了一个线程安全的映射。也就是说,多个线程可以一次访问该映射,而不会影响映...