xiaobaoqiu Blog

Think More, Code Less

Java并发容器之Concurrent

包括四种容器:

ConcurrentHashMap
ConcurrentLinkedQueue
ConcurrentMap
ConcurrentNavigableMap

其中ConcurrentLinkedQueue是并发环境下非阻塞算法的典型实现。

1.ConcurrentMap

ConcurrentMap是继承Map的一种interface,定义了一下几个api接口:

1
2
3
4
5
6
public interface ConcurrentMap<K, V> extends Map<K, V> {
    V putIfAbsent(K key, V value);
    boolean remove(Object key, Object value);
    boolean replace(K key, V oldValue, V newValue);
    V replace(K key, V value);
}

2.ConcurrentNavigableMap

ConcurrentNavigableMap是继承ConcurrentMap的一种interface。

我们从SortedMap接口开始锁说,因为ConcurrentNavigableMap继承自NavigableMap,而NavigableMap继承自SortedMap。

2.1 SortedMap

实现SortedMap接口的类有排序功能,SortedMap相比普通Map提供了几个特殊的接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public interface SortedMap<K,V> extends Map<K,V> {
    /**
     * 返回key在 [fromKey, toKey)之间的子map的视图
     */
    SortedMap<K,V> subMap(K fromKey, K toKey);

    /**
     * 返回key严格小于toKey的子map视图
     */
    SortedMap<K,V> headMap(K toKey);

    /**
     * 返回key大于等于fromKey的子map视图
     */
    SortedMap<K,V> tailMap(K fromKey);

    /**
     * 返回map中第一个key
     */
    K firstKey();

    /**
     * 返回map中最后一个key
     */
    K lastKey();
}

2.2 NavigableMap

NavigableMap扩展的 SortedMap,具有了针对给定搜索目标返回最接近匹配项的导航方法。方法 lowerEntry、floorEntry、ceilingEntry 和 higherEntry 分别返回与小于、小于等于、大于等于、大于给定键的键关联的 Map.Entry 对象,如果不存在这样的键,则返回 null。类似地,方法 lowerKey、floorKey、ceilingKey 和 higherKey 只返回关联的键。

可以按照键的升序或降序访问和遍历 NavigableMap。descendingMap 方法返回映射的一个视图,该视图表示的所有关系方法和方向方法都是逆向的。升序操作和视图的性能很可能比降序操作和视图的性能要好。

此接口还定义了 firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry 方法,它们返回和/或移除最小和最大的映射关系(如果存在),否则返回 null。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
public interface NavigableMap<K,V> extends SortedMap<K,V> {
    /**
     * 返回Map中严格小于给定key的最大的Entry,不存在则返回null
     */
    Map.Entry<K,V> lowerEntry(K key);

    /**
     * 返回Map中严格小于给定key的最大的key,不存在则返回null
     */
    K lowerKey(K key);

    /**
     * 返回Map中小于等于给定key的最大的Entry,不存在则返回null
     */
    Map.Entry<K,V> floorEntry(K key);

    /**
     * 返回Map中小于等于给定key的最大key,不存在则返回null
     */
    K floorKey(K key);

    /**
     * 返回大于等于给定key的最小的Entry,不存在返回null
     */
    Map.Entry<K,V> ceilingEntry(K key);

    /**
     * 返回大于等于给定key的最小的key,不存在返回null
     */
    K ceilingKey(K key);

    /**
     * 返回严格大于给定key的最小的Entry,不存在返回null
     */
    Map.Entry<K,V> higherEntry(K key);

    /**
     * 返回严格大于给定key的最小的key,不存在返回null
     */
    K higherKey(K key);

    /**
     * 返回Map中key最小的Entry,不存在则返回null
     */
    Map.Entry<K,V> firstEntry();

    /**
     * 返回Map中key最大的Entry,不存在则返回null
     */
    Map.Entry<K,V> lastEntry();

    /**
     * 删除并返回Map中key最小的Entry
     */
    Map.Entry<K,V> pollFirstEntry();

    /**
     * 删除并返回Map中key最大的Entry
     */
    Map.Entry<K,V> pollLastEntry();

    /**
     * 返回当前Map的降序的视图
     * 注意,降序Map依靠当前Map实现,因此改变当前Map或者这个降序Map都会反映在彼此上
     */
    NavigableMap<K,V> descendingMap();

    /**
     * 返回当前Map的Key集合的试图
     * 改变当前Map或者这个Set都会影响彼此
     */
    NavigableSet<K> navigableKeySet();

    /**
     * 返回当前Map的降序顺序的Key集合的试图
     * 和navigableKeySet一样,改变当前Map或者这个降序Set都会影响彼此
     */
    NavigableSet<K> descendingKeySet();

    /**
     * 返回key在[fromKey, toKey]之间的试图,如果fromInclusive为true,结果中包含fromKey
     * 对应Entity,如果toInclusive为跳入额, 则结果中包含了toKey对应Entity
     */
    NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive,
                             K toKey,   boolean toInclusive);

    /**
     * 返回key小于(如果inclusive为true,则包括等于)toKey的视图
     */
    NavigableMap<K,V> headMap(K toKey, boolean inclusive);

    /**
     * 返回key大于(如果inclusive为true,则包括等于)fromKey的视图
     */
    NavigableMap<K,V> tailMap(K fromKey, boolean inclusive);
}

同时NavigableMap也包含了三个返回SortedMap的接口

1
2
3
4
5
SortedMap<K,V> subMap(K fromKey, K toKey);

SortedMap<K,V> headMap(K toKey);

SortedMap<K,V> tailMap(K fromKey);

2.3 ConcurrentNavigableMap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ConcurrentNavigableMap继承了ConcurrentMap和NavigableMap两个接口
public interface ConcurrentNavigableMap<K,V>
    extends ConcurrentMap<K,V>, NavigableMap<K,V>
{
    ConcurrentNavigableMap<K,V> subMap(K fromKey, boolean fromInclusive,
                                       K toKey,   boolean toInclusive);

    ConcurrentNavigableMap<K,V> headMap(K toKey, boolean inclusive);

    ConcurrentNavigableMap<K,V> tailMap(K fromKey, boolean inclusive);

    ConcurrentNavigableMap<K,V> subMap(K fromKey, K toKey);

    ConcurrentNavigableMap<K,V> headMap(K toKey);

    ConcurrentNavigableMap<K,V> tailMap(K fromKey);

    ConcurrentNavigableMap<K,V> descendingMap();

    public NavigableSet<K> navigableKeySet();

    NavigableSet<K> keySet();

    public NavigableSet<K> descendingKeySet();
}

3.ConcurrentLinkedQueue

ConcurrentLinkedQueue是非阻塞算法的典型实现,因此单独写了一篇。

http://xiaobaoqiu.github.io/blog/2014/12/24/concurrentlinkedqueue/

4.ConcurrentHashMap

ConcurrentHashMap值得研究,也单独写了一篇。

http://xiaobaoqiu.github.io/blog/2014/12/24/concurrenthashmap/

5.参考

https://www.ibm.com/developerworks/cn/java/j-lo-concurrent/