1. 程式人生 > >【Java並發核心九】並發集合框架

【Java並發核心九】並發集合框架

array nwr current peek 子類 bsp 並發測試 name copy

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 類似的功能,但具有嗅探功能,可以嘗試性地添加一些數據

【Java並發核心九】並發集合框架