HashMap、Hashtable、ConcurrentHashMap、ConcurrentSkipListMap对比及java并发包(java.util.concurrent)
一、基础普及
接口(interface) |
类(class) |
继承类 |
实现的接口 |
|
Array |
√ |
|||
Collection |
√ |
|||
Set |
√ |
Collection |
||
List |
√ |
Collection |
||
Map |
√ |
Collection |
||
Vector |
√ |
List |
||
ArrayList |
√ |
List |
||
HashMap |
√ |
Map |
||
Hashtable |
√ |
Dictionary |
Map |
|
ConcurrentMap |
√ |
Map |
||
ConcurrentHashMap
|
√ |
ConcurrentMap |
二、对比
1、HashMap与Hashtable区别
是否线程安全 |
允不允许null值 |
|
Hashtable |
线程安全。 因为里面的方法使用了synchronized进行同步 |
不允许。 key和value都不允许出现null值,否则会抛出NullPointerException异常。 |
HashMap |
非线程安全。 可以通过以下方式进行同步: Map m = Collections.synchronizeMap(hashMap); |
允许。 null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。 |
Tip:
1、Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
2、由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
2、Hashtable和ConcurrentHashMap在lock表区别图
三、java并发包(java.util.concurrent)
1、线程池:
1.1、为什么要用到线程池
使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。
如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
1.2、线程池创建方式(常用)
1)固定数量的线程池newFixedThreadPool
int cpu = Runtime.getRuntime().availableProcessors();
final ExecutorService es = Executors.newFixedThreadPool(cpu);
2)可调度的线程池Scheduled Thread Pool :
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
2、Java容器:
2.1、同步类容器
第一类:
同步类:Vector、Stack、Hashtable
非同步类:ArrayList、LinkedList、HashMap
第二类:Collections提供的一些工厂类(静态)
2.2、并发类容器
java.util.concurrent提供了多种并发容器,总体上来说有4类:
- 队列Queue类型的BlockingQueue和ConcurrentLinkedQueue
- Map类型的ConcurrentMap
- Set类型的ConcurrentSkipListSet和CopyOnWriteArraySet
- List类型的CopyOnWriteArrayList
在并发比较大的情况下,用ConcurrentMap来替代HashTable
使用CopyOnWriteArrayList替代Vector
2.3、concurrentHashMap
2.3.1、为什么采用concurrentHashMap:
Hashtable写操作会锁住整张表,效率低,写操作无法并行
concurrentHashMap分成16个桶(把整张表分成16份),适合高并发
2.3.2、ConcurrentHashMap介绍:
ConcurrentHashMap采用了分段锁的设计,只有在同一个分段内才存在竞态关系,不同的分段锁之间没有锁竞争。
相比于对整个Map加锁的设计,分段锁大大的提高了高并发环境下的处理能力。
2.3.3、Hashtable和ConcurrentHashMap在lock表区别图
2.3.4、ConcurrentSkipListMap
跳表查询,比ConcurrentHashMap效率快。
四、Java并发包消息队列
1、BlockingQueue 阻塞队列
主要的方法是:put、take一对阻塞存取;add、poll一对非阻塞存取。
put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻塞直到BlockingQueue里面有空间再继续。
take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止。
2、BlockingQueue成员介绍
2.1、ArrayBlockingQueue:
基于数组实现的有界阻塞队列,查找快,增删慢。生产者和消费者用的是同一把锁,并发效率低
消费的方式:FIFO
2.2、LinkedBlockingQueue:
基于链表实现的阻塞队列,链表是增删快,定位慢,生产者和消费者用的锁相互独立,并发性能略高于ArrayBlockingQueue
2.3、DelayQueue(延时队列):
DelayQueue中的元素,只有指定的延迟时间到了,才能够从队列中获取到该元素。
DelayQueue是一个没有大小限制的队列,因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞
应用场景
1、客户端长时间占用连接的问题,超过这个空闲时间了,可以移除的
2、处理长时间不用的缓存;如果队列里面的对象长时间不用,超过了空闲时间,就移除
3、任务超时处理
2.4、PriorityBlockingQueue(优先级队列):
PriorityBlockingQueue并不会阻塞数据生产者,而只会在没有可消费的数据时,阻塞数据的消费者不阻塞生产者
compareTo()方法决定优先级。
2.5、SynchronousQueue(同步无缓冲队列):
一种无缓冲的等待队列,来一个任务就执行这个任务,这期间不能太添加任何的任务。也就是不用阻塞了,其实对于少量任务而言,这种做法更高效
声明一个SynchronousQueue有两种不同的方式,它们之间有着不太一样的行为。
公平模式和非公平模式的区别:
如果采用公平模式:SynchronousQueue会采用公平锁,并配合一个FIFO队列来阻塞多余的生产者和消费者,从而体系整体的公平策略;
但如果是非公平模式(SynchronousQueue默认):SynchronousQueue采用非公平锁,同时配合一个LIFO队列来管理多余的生产者和消费者,而后一种模式,如果生产者和消费者的处理速度有差距,则很容易出现饥渴的情况,即可能有某些生产者或者是消费者的数据永远都得不到处理。
2.5、concurrentLinkedQueue(高并发无锁队列)
HashMap、Hashtable、ConcurrentHashMap、ConcurrentSkipListMap对比及java并发包(java.util.concurrent)的更多相关文章
- [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...
- 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhange ...
- hashmap,hashTable concurrentHashMap 是否为线程安全,区别,如何实现的
线程安全类 在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的.在jdk1.2之后,就出现许许多多非线程安全的类. 下面是这些线程安全的同步的类: vector:就比arraylist多 ...
- HashMap,HashTable,concurrentHashMap,LinkedHashMap 区别
HashMap 不是线程安全的 HashTable,concurrentHashMap 是线程安全 HashTable 底层是所有方法都加有锁(synchronized) 所以操作起来效率会低 con ...
- Java7/8 中 HashMap 和 ConcurrentHashMap的对比和分析
大家可能平时用HashMap比较多,相对于ConcurrentHashMap 来说并不是很熟悉.ConcurrentHashMap 是 JDK 1.5 添加的新集合,用来保证线程安全性,提升 Map ...
- java并发包java.util.concurrent详解
线程池ThreadPoolExecutor的使用 并发容器之CopyOnWriteArrayList 并发容器之CopyOnWriteArraySet 数据结构之ConcurrentHashMap,区 ...
- Java集合——HashMap,HashTable,ConcurrentHashMap区别
Map:“键值”对映射的抽象接口.该映射不包括重复的键,一个键对应一个值. SortedMap:有序的键值对接口,继承Map接口. NavigableMap:继承SortedMap,具有了针对给定搜索 ...
- HashMap HashTable ConcurrentHashMap
1. Hashtable 和 HashMap (1)区别,这两个类主要有以下几方面的不同:Hashtable和HashMap都实现了Map接口,但是Hashtable的实现是基于Dictionary抽 ...
- HashMap/Hashtable/ConcurrentHashMap区别
HashMap:每个隔间都没锁门,有人想上厕所,管理员指给他一个隔间,里面没人的话正常用,里面有人的话把这个人赶出来然后用. 优点,每个人进来不耽误都能用:缺点,每一个上厕所的人都有被中途赶出来的危险 ...
随机推荐
- 最短路问题-- Dijkstra Choose the best route
Choose the best route Problem Description One day , Kiki wants to visit one of her friends. As she i ...
- SQL基础教程(第2版)第7章 集合运算:7-1 表的加减法
第7章 集合运算:7-1 表的加减法 ● 集合运算就是对满足同一规则的记录进行的加减等四则运算.● 使用UNION(并集). INTERSECT(交集). EXCEPT(差集)等集合运算符来进行集合运 ...
- MySQL性能管理及架构设计:第2章 什么影响了MySQL性能
第2章 什么影响了MySQL性能 2-1 影响性能的几个方面 1.服务器的硬件 2.服务器的操作系统 3.数据库的存储引擎 4.数据库的参数配置 5.数据库表结构设计和SQL语句的编写和优化 2-2 ...
- [转帖西部数据的Zonefs将会登陆Linux 5.6内核]
西部数据的Zonefs将会登陆Linux 5.6内核 https://www.cnbeta.com/articles/tech/948875.htm 据说SMR 能够提高25%的存储密度 但是会造成严 ...
- 网鼎杯-Fakebook-反序列化和SSRF和file协议读取文件
0x00知识点:SSRF SSRF (Server-side Request Forge, 服务端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外 ...
- idea抛出异常:org.apache.shiro.authc.AuthenticationException
问题描述 继续在ubuntu下折腾,终于将web项目的所有的东西配置好了,然后运行项目,满怀期待的心情登录系统的时候,突然出现了这个bug,吓得我差点从椅子上跳起来,这两天遇到的bug实在是太多了.. ...
- GUI(Graphical User Interface)
译:用户和图形界面 GUI与程序交互的不同方式,包含3基本要素:输入,处理和输出. 常用GUI框架包括以下几种: wxPython Kivy Flexx PyQt Tkinter Pywin32 Py ...
- vscode显示当前文件完整路径信息
Code->Preferences->Settings 搜索window.title 原本是activeEditorShort,修改 activeEditorShort => act ...
- 等和的分隔子集(dp)
晓萌希望将 1 到 N 的连续整数组成的集合划分成两个子集合,且保证每个集合的数字和是相等. 例如,对于 N = 3,对应的集合 1, 2, 3 能被划分成3和1,2两个子集合. 这两个子集合中元素分 ...
- sol - 0x60,61,62
[例题]走廊泼水节 设当前扫描到边x,y,长度为z,x所处的并查集为Sx,y所处的并查集为Sy: 对于任意u属于Sx,v属于Sy,我们可以知道u,v之间必连一条边 但是我们要在保证x,y之间的边属于唯 ...