Java高并发程序设计--JDK的并发容器

Posted 蒋曾的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java高并发程序设计--JDK的并发容器相关的知识,希望对你有一定的参考价值。

1、线程安全的HashMap

如果需要一个线程安全的HashMap ,可以使用集合工具类的synchronizedMap(Map<K,V> m)方法实现,

Collections.synchronizedMap(m);

进到方法里面,

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
    return new SynchronizedMap<K,V>(m);
    }

它返回一个内部类,进入内部类

private static class SynchronizedMap<K,V>
    implements Map<K,V>, Serializable {

    private final Map<K,V> m;     // Backing Map
    final Object      mutex;    
    。。。。。
}

发现它是用的代理的方法来实现的,所有功能全都由传进来的Map,也就是m实现,它只负责给方法加锁。如:

public V put(K key, V value) {
        synchronized(mutex) {return m.put(key, value);}
        }
public V get(Object key) {
        synchronized(mutex) {return m.get(key);}
        }

除此方法外,还有更加专业的ConcurrentHashMap,可以在原来的博客中找到相关内容。

 

2、线程安全的List

和HashMap相似,也可以通过Collections.synchronizedList(list)来获得一个线程安全的ArrayList或者LinkedList。

同样,JDK也提供了一个CopyOnWriteArrayList来实现线程安全。

CopyOnWriteArrayList适用于读多写少的场景,对他来说读读操作完全不需要加锁,读写同时发生也不会堵塞,只要在写写同时发生时才需要同步。

在写入操作时,它会进行一次复制,然后在复制的副本上进行修改,最后用副本替换原来的数据。

 

3、数据共享通道:BlockingQueue

它是一个接口,一般用来在线程之间共享数据,有以下的具体实现:

下面是它的方法:

其中,当你put时,向队尾压进一个数据,如队列已满,则等待队列有空再进去,当你take时,如果为空,则会一直等待到不为空。

 

以上是关于Java高并发程序设计--JDK的并发容器的主要内容,如果未能解决你的问题,请参考以下文章

多线程之并发容器ConcurrentHashMap

java高并发编程

14.并发容器之ConcurrentHashMap(JDK 1.8版本)

java高并发编程

阿里大牛手写的JDK源码剖析手册与并发编程图册,完美诠释高并发

使用JDK的同步容器时,应该避免那些坑?