【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 类似的功能,但具有嗅探功能,可以尝试性地添加一些数据

原文地址:https://www.cnblogs.com/klbc/p/9799672.html

时间: 2024-10-12 04:52:10

【Java并发核心九】并发集合框架的相关文章

ACCP8.0 java课程第二学期-关于集合框架

本章重点 掌握ArrayList LinkedList HashMap与泛型集合 本章难点 泛型的理解 一 关于集合1)如果写程序时不知道运行时需要多少对象,或者需要更复杂的方式存储对象时,考虑使用集合它位于java.util包下2)集合框架包含接口,实现类,和相关算法3)Collection接口存储一组不唯一,无序的对象4)Set接口继承Collection接口,存储一组唯一无序的对象5)List接口继承Collection接口,存储一组不唯一有序的对象6)Map接口存储一组键值对的对象,ke

Java复习第三天---集合框架的相关知识

集合框架总览: Collection 接口常用方法 //1.add()向集合中添加数据 c.add(apple01); c.add(apple02); c.add(apple03); c.add(apple04); c.add(apple05); //2.isEmepty()检测当前集合是否为空 boolean empty = c.isEmpty(); System.out.println("is empty:"+empty); //3.size()返回当前集合的长度 int size

Java笔记(8)-泛型与集合框架

泛型与集合框架 泛型 泛型类 泛型类声明对象 示例 泛型接口 示例 泛型的目的 链表 LinkedList E 泛型类 常用方法 遍历链表 示例 排序和查找 示例 洗牌和旋转 堆栈 示例 散列映射 HashMap KV 泛型类 常用方法 遍历散列映射 基于散列映射的查询 示例 树集 TreeSetE泛型类 节点的大小关系 TreeSet类常用方法 示例 树映射 泛型与集合框架 组织数据之结构及相关操作. 泛型 泛型(Generics)是在JDK1.5中推出的,其主要目的是可以建立具有类型安全的集

Java基础知识强化之集合框架笔记07:Collection集合的遍历之迭代器遍历

1. Collection的迭代器: 1 Iterator iterator():迭代器,集合的专用遍历方式 2. 代码示例: package cn.itcast_03; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /* * Iterator iterator():迭代器,集合的专用遍历方式 * Iterator(迭代器): * Object next():获取元素,并移动

Java基础知识强化之集合框架笔记11:Collection集合之迭代器的原理及源码解析

1. 迭代器为什么不定义成一个类,而是定义为一个接口 ?  答:假设迭代器定义的是一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历.但是呢? 我们想想,Java中提供了很多的集合类,而这些集合类的数据结构是不同的,所以,存储的方式和遍历的方式应该是不同的.进而它们的遍历方式也应该不是一样的,最终,就没有定义迭代器类.        而无论你是哪种集合,你都应该具备获取元素的操作,而且,最好在辅助于判断功能,这样,在获取前,先判断.这样的话就不容易出错.也就是说,判断功能和获取

Java基础知识强化之集合框架笔记60:Map集合之TreeMap(TreeMap&lt;Student,String&gt;)的案例

1. TreeMap(TreeMap<Student,String>)的案例 2. 案例代码: (1)Student.java: 1 package cn.itcast_04; 2 3 public class Student { 4 private String name; 5 private int age; 6 7 public Student() { 8 super(); 9 } 10 11 public Student(String name, int age) { 12 super

Java基础知识强化之集合框架笔记57:Map集合之HashMap集合(HashMap&lt;Student,String&gt;)的案例

1. HashMap集合(HashMap<Student,String>)的案例 HashMap<Student,String>键:Student      要求:如果两个对象的成员变量值都相同,则为同一个对象.值:String HashMap是最常用的Map集合,它的键值对在存储时要根据键的哈希码来确定值放在哪里. HashMap 中作为键的对象必须重写Object的hashCode()方法和equals()方法 2. 代码示例: (1)Student.java,如下: 1 pa

Java基础知识强化之集合框架笔记58:Map集合之LinkedHashMap类的概述

1. LinkedHashMap类的概述 LinkedHashMap:Map接口的哈希表(保证唯一性) 和 链接(保证有序性)列表实现,具有可预知的迭代顺序. 2. 代码示例: 1 package cn.itcast_03; 2 3 import java.util.LinkedHashMap; 4 import java.util.Set; 5 6 /* 7 * LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序. 8 * 由哈希表保证键的唯一性 9 * 由链

Java基础知识强化之集合框架笔记59:Map集合之TreeMap(TreeMap&lt;String,String&gt;)的案例

1. TreeMap类的概述: 键是红黑树结构,可以保证键的排序和唯一性. 2. TreeMap案例: TreeMap<String, String> 代码示例: 1 package cn.itcast_04; 2 3 import java.util.Set; 4 import java.util.TreeMap; 5 6 /* 7 * TreeMap:是基于红黑树的Map接口的实现. 8 * 9 * HashMap<String,String> 10 * 键:String 11