美文网首页
线程安全集合

线程安全集合

作者: 程序员札记 | 来源:发表于2022-04-25 08:47 被阅读0次

    早期线程安全的集合

    我们先从早期的线程安全的集合说起,它们是Vector和HashTable

    1. Vector
      Vector和ArrayList类似,是长度可变的数组,与ArrayList不同的是,Vector是线程安全的,它给几乎所有的public方法都加上了synchronized关键字。由于加锁导致性能降低,在不需要并发访问同一对象时,这种强制性的同步机制就显得多余,所以现在Vector已被弃用
    2. HashTable
      HashTable和HashMap类似,不同点是HashTable是线程安全的,它给几乎所有public方法都加上了synchronized关键字,还有一个不同点是HashTable的K,V都不能是null,但HashMap可以,它现在也因为性能原因被弃用了。

    Collections包装方法

    Vector和HashTable被弃用后,它们被ArrayList和HashMap代替,但它们不是线程安全的,所以Collections工具类中提供了相应的包装方法把它们包装成线程安全的集合
    List<E> synArrayList = Collections.synchronizedList(new ArrayList<E>());
    Set<E> synHashSet = Collections.synchronizedSet(new HashSet<E>());
    Map<K,V> synHashMap = Collections.synchronizedMap(new HashMap<K,V>());
    每种集合都声明了一个线程安全的包装类,在原集合的基础上添加了锁对象,集合中的每个方法都通过这个锁对象实现同步

    java.util.concurrent包中的集合

    image.png

    Pattern: Concurrent* Blocking* CopyonWrite*

    • CopyOnWrite 是读写分离
    • Concurrent是 保护线程安全的, 但是拿不到数据,放不进去 也允许。
    • Blocking是为producer consumer 设计的,一定要拿到或者放入数据。 拿不到,或者没东西放就阻塞等待。除非调用端放弃。

    从下面开始就要开始介绍线程安全结合了。这也是并发编程的最后一章。

    相关文章

      网友评论

          本文标题:线程安全集合

          本文链接:https://www.haomeiwen.com/subject/ahcfyrtx.html