【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 类似的功能,但具有嗅探功能,可以尝试性地添加一些数据
【Java并发核心九】并发集合框架的更多相关文章
- Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介
1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...
- JAVA基础第五章-集合框架Map篇
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...
- Java学习笔记【九、集合框架】
集合框架设计的目标: 高性能. 允许不同类型的集合,以类似的方式工作,有互操作性. 对一个集合的扩展和适应必须简单. 集合框架包含: 接口:代表集合的抽象数据类型. 实现(类):具体实现(ArrayL ...
- java内部类、接口、集合框架、泛型、工具类、实现类
.t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.内部类 1.成员内部类. (1)成员内部类的实例化: 外部类名.内部类 ...
- 《java入门第一季》集合框架引入与面试题
注:在开始的几篇集合介绍里,不包含泛型的概念.泛型在讲述所有集合后再加入进去. 集合的由来: 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我 ...
- JAVA基础第四章-集合框架Collection篇
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...
- Java基础(十一)集合框架
一.集合框架 1.集合框架定义 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常 ...
- java字符串,数组,集合框架重点
1.字符串的字面量是否自动生成一个字符串的变量? String str1 = “abc”; Sring str2 = new String (“abc”); 对于str1:Jvm在遇到双 ...
- java基础(13)---集合框架
一.集合框架 Java的集合类是一些非常实用的工具类,主要用于存储和装载数据 (包括对象),因此,Java的集合类也被成为容器.在Java中,所有的集合类都位于java.util包下,这些集合类主要是 ...
- Java基础知识强化之集合框架笔记39:Set集合之HashSet存储字符串并遍历
1. HashSet类的概述: (1)不保证set的迭代顺序 (2)特别是它不保证该顺序恒久不变 HashSet底层数据结构是哈希表,哈希表依赖于哈希值存储,通过哈希值来确定元素的位置, 而保证元素 ...
随机推荐
- Confluence 6 创建一个主题
如果你希望创建你自己的主题,你需要写一个 Confluence 插件.请参考我们开发文档中的下面页面 开始使用 插件开发. 请参考开发者指南的页面来 写一个 Confluence 主题. 使用 主题插 ...
- mysql 安装问题二:mysqld: Can't create directory 'E:\Software\mysql-5.7.24-winx64\data\' (Errcode: 2 - No such file or directory)
原因:my.ini文件中的basedir(设置mysql的安装目录).datadir(设置mysql数据库的数据的存放目录)与MySQL解压后的路径不一致 解决办法: 将basedir=E:\Soft ...
- Python基础之常用模块
一.time模块 1.时间表达形式: 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串: 1.1.时间戳(timestamp) :通常来说,时间 ...
- jsp 监听器
Servlet API提供了一系列的事件和事件监听接口. 上层的servlet/JSP应用能够通过调用这些API进行事件 驱动的开发.这里监听的所有事件都继承自 java.util.Event对象.监 ...
- tomcat启动报错:Annotation-specified bean name 'patrolTrailServiceImpl' for bean class [cn.oppo.inventoryService.patrolTrailServiceImpl] con
注释-为bean类[目录服务patrolTrailServiceImpl]指定的bean名称“patrolTrailServiceImpl”与同名和[目录服务patrolTrailServiceImp ...
- 010-Python-socket编程
客户端/服务器的架构 物理层:网卡,光缆,双绞线 数据链路层:包含源mac地址和目标的mac地址,通过广播通讯 网络层:跑的IP协议,IP地址可以定义到一个子网:通过ARP协议可以解析为mac地址: ...
- javac选项以递归方式编译给定目录下的所有Java文件 - IT屋-程序员软件开发技术分享社区
http://www.it1352.com/539276.html #Linux $ find -name“* .java”> sources.txt $ javac @ sources.txt ...
- SqlServer 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
CREATE TABLE [dbo].[Order]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserId] [int] NOT NULL, [TotalPrice] ...
- 解决notepad++64位没有plugin manager的问题
安装了最新的notepad++版本发现没有插件管理器,很难受. 后来上官网发现了这样一句话 Note that the most of plugins (including Plugin Manage ...
- cPanel中添加设置附加域(Addon domain)
本文介绍cPanel设置附加域(addon domain)来实现一个空间做多个网站的方法. 附加域(addon domain) 作用:通过它可以实现添加 新的顶级域名绑定到主机,从而创建新的站点.例如 ...