【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 Oracle 创建数据库用户
创建用户后并且指派权限: 使用 sqlplus 命令行工具通过命令行来访问 Oracle sqlplus user/password <as sysdba|as sysoper> 如果你的 ...
- Swift 给UITableView 写extension 时 报错 does not conform to protocol 'UITableViewDataSource'
那是因为你没有实现 数据源和代理方法 实现下就好了 func tableView(_ tableView: UITableView, numberOfRowsInSection section: In ...
- Scratch 2.0-Find The Mouse 发布!
日期:2018.8.26 星期日 博客期:007 今天随便写了一个小型游戏程序,哈哈!虽然小,但用到的逻辑还是有一定水平的.呼~毕竟就这一下子也写不出来微软一样的公司嘛!哈哈,截图放上来! 游戏分为四 ...
- css固定表头,表单内容可以滑动
<html><head> <meta charset="utf-8"> <title>Table</title&g ...
- 10,关于在vs2017中的netcore项目使用BundlerMinifier 配置问题
查阅资料 https://github.com/madskristensen/BundlerMinifier/issues/230 今天下载了vs2017 rc 创建了个netcore的web项目,突 ...
- 小学生都看得懂的C语言入门(4): 数组与函数
// 之前判断素数, 只需要到sqrt(x)即可,//更加简单的, 判断能够比已知的小于x的素数整除, 运行更快 #include <stdio.h> // 之前判断素数, 只需要到sqr ...
- bzoj 1856
做这题之前先看道高考真题(好像是真题,我记不清了) 例:已知一个由n个0和n个1排列而成的数列,要求对于任意k∈N*且k∈[1,2n],在前k个数中1的个数不少于0的个数,求当n=4时这样的数列的数量 ...
- 20165314 2016-2017-2 《Java程序设计》第8周学习总结
20165314 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 java中的线程 线程的常用方法 GUI线程 多线程的概念 代码托管
- appium+python测试app使用相对坐标定位元素
我们获取到的是绝对坐标,如果换一个屏幕分辨率不同的手机那这个坐标自然会发生变化,要实现不同手机均能实现点击同一控件自然要用到相对坐标了,具体方法如下: 1.获取当前空间的绝对坐标(x1,y1),开启指 ...
- SyntaxError: EOL while scanning string literal
在Python 中,这个提示,一般是因为特殊字符引起的,比如换行符,比如 \ 等. 下面有几个示例: 1. 换行符 # 源错误代码 get_tabs="select b.owner,b.ta ...