Collections生成的线程安全容器

同步容器

[TOC]

Collections返回的线程安全容器

Collections类中有一些方法可以返回线程安全的容器。

public static <T> Collection<T> synchronizedCollection(Collection<T> c);
public static <T> List<T> synchronizedList(List<T> list);
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m); 
……

底层的实现是通过包装一层函数,给所有原有容器方法都加上 synchronized来同步实现的。下面是SynchronizedMap的源码:

 private static class SynchronizedMap<K,V> implements Map<K,V>, Serializable {
        private final Map<K,V> m;     // Backing Map
        final Object      mutex;        // Object on which to synchronize

        SynchronizedMap(Map<K,V> m) {
            this.m = Objects.requireNonNull(m);
            mutex = this;
        }

        SynchronizedMap(Map<K,V> m, Object mutex) {
            this.m = m;
            this.mutex = mutex;
        }

        public int size() {
            synchronized (mutex) {return m.size();}
        }
        public boolean isEmpty() {
            synchronized (mutex) {return m.isEmpty();}
        }
        public boolean containsKey(Object key) {
            synchronized (mutex) {return m.containsKey(key);}
        }
        //……
 }

使用这些线程安全容器的注意事项

在下面几种情况,可能导致线程不安全:

  1. 复合操作,比如先检查再更新。
  2. 伪同步,对 synchronized 的操作对象不熟悉,synchronized 必须锁定同一个对象。
  3. 迭代,单个操作安全,循环迭代并不安全。

推荐的线程安全容器

SynchronizedMap等Collections生成的线程安全容器,使用synchronized来同步,性能较低。
如果有对应的替代类,一般优先使用jdk中专门提供的替代类,比如:

CopyOnWriteArrayList
ConcurrentHashMap
ConcurrentLinkedQueue
ConcurrentSkipListSet
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 5,632评论 0 12
  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 5,414评论 0 6
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 7,600评论 0 11
  • 一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发...
    慕容小伟阅读 5,798评论 0 10
  • 反思日记48 十点半睡五点半醒。6.37-7.34 001 这几天都睡太晚了。每天早上五点多自然醒。 01 九点半...
    肖肖小太阳阅读 2,939评论 0 0