zoukankan      html  css  js  c++  java
  • 【Java并发核心九】并发集合框架

    1、List接口:ArrayList 和 Vector

      ArrayList不是线程安全的,Vector是线程安全的,Vector有一个子类,可实现后进先出(LIFO)的对象堆栈(LinkedList 也是List接口的实现类)。

    2、Set接口:HashSet 和 TreeSet

      Set接口最常见的实现类是HashSet,HashSet默认是以无序的方式组织元素的,而LinkedHashSet可以有序组织元素;

      Treeset不仅实现了Set接口,还实现了SortedSet和NavigableSet接口。

    3、Queue 和 Deque 接口

      接口Queue是Collection接口的子接口,支持对表头的操作,接口Queue的非并发实现类是PriorityQueue;

      接口Deque不仅支持对表头进行操作,而且还支持对表位进行操作,故Deque全称是“dubbo ended queue(双端队列)”,Deque的非并发实现类是ArrayDeque、LinkedList。

    4、非阻塞队列:

      ConcurrentHashMap    多个并发线程同时使用同一个HashMap对象时,会出现“程序假死”状态,因为HashMap是线程不安全的,不能被多个线程所操作,HashTable虽然线程安全的,但是在多线程iterator()循环中调用remove()时会报异常,解决办法就是使用ConcurrentHashMap 代替。后面写了一个test,可以参考一下。

      ConcurrentSkipListMap    ConcurrentHashMap不支持排序,而ConcurrentSkipListMap 是 ConcurrentHashMap 的可排序版本

      ConcurrentSkopListSet    支持排序且不允许重复的元素

      ConcurrentLinkedQueue    提供并发环境的队列操作,常用方法:poll()、element()、peek()、add()

      ConcurrentLinkedDeque    ConcurrentLinkedQueue 仅支持表头操作,ConcurrentLinkedDeque 支持队列头和队列尾双向操作

      CopyOnWriteArrayList    ArrayList是非线程安全类,如果想在并发中实现安全,需要使用CopyOnWriteArrayList,CopyOnWriteArrayList 可以在循环中删除元素

      CopyOnWriteArraySet    HashSet的线程安全实现

    package com.cd.thread;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    public class ConcurrentClassTest {
        public static void main(String args[]) {
            //        mapTest();
            mapTest2();
        }
    
        public static void mapTest() { //  HashMap并发测试,运行此方法,程序会假死
            Map map = new HashMap();
            new MyThread("小A", map).start();
            new MyThread("小B", map).start();
        }
    
        public static void mapTest2() { //  ConcurrentHashMap并发测试,运行此方法,程序正常运行
            Map map = new ConcurrentHashMap();
            new MyThread("小A", map).start();
            new MyThread("小B", map).start();
        }
    
        private static class MyThread extends Thread {
            private String name;
    
            private Map map;
    
            private MyThread(String name, Map map) {
                this.name = name;
                this.map = map;
            }
    
            public void run() {
                for (int i = 0; i < 50000; i++) {
                    map.put(name + "-" + i, name + "-" + i);
                    System.out.println(name + "-" + i);
                }
            }
        }
    
    }

    5、阻塞队列:

      ArrayBlockingQueue    有界阻塞队列

      PriorityBlockingQueue    并发情况下的有限队列

      LinkedBlockingQueue    与 ArrayBlockingQueue 功能一致,但是 LinkedBlockingQueue 是无界的

      LinkedBlockingDueue    LinkedBlockingQueue 的双向队列版本

      SynchronousQueue    异步队列,每个插入操作必须等待另一个线程的对应移除操作,反之亦然。

      DelayQueue    延时执行任务的队列

      LinkedTransferQueue    提供与 SynchronousQueue 类似的功能,但具有嗅探功能,可以尝试性地添加一些数据

  • 相关阅读:
    Sql ISNULL() 函数
    C#WinForm中按钮响应回车事件的简单方法
    职场升迁全攻略 人脉资源是铺垫
    怎样成为有钱人
    睡前应做六件事
    赚钱的秘诀(转)
    将Win2003转换成个人PC版系统
    抠图神器Inpaint 4.2
    iPhone升级记:从4.3.3到5.0.1:越狱篇
    iPhone升级记:从4.3.3到5.0.1:弯路篇
  • 原文地址:https://www.cnblogs.com/klbc/p/9799672.html
Copyright © 2011-2022 走看看