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 类似的功能,但具有嗅探功能,可以尝试性地添加一些数据
原文地址:https://www.cnblogs.com/klbc/p/9799672.html