java多线程:并发包中ConcurrentHashMap和jdk的HashMap的对比
一:HashMap
--->底层存储的是Entry<K,V>[]数组
--->Entry<K,V>的结构是一个单向的链表
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
int hash;
/**
* Creates new entry.
*/
Entry(int h, K k, V v, Entry<K,V> n) {
value = v;
next = n;
key = k;
hash = h;
}
}
--->存储或移除的定位。
(1)存储key的时候,先取key的hascode,然后对hascode进行一系列的按位与,按位异或运算最终得到一个数字,再拿这个数字和Entry[]数组的长度减一进行按位与运算,求出要存储的数组下标。
(2)拿到数组上的entry对象,然后遍历,对key的hashcode比较。如果hashcode相同,再进行equals比较内容。如果都相同,则表示是同一个key,则进行替换。如果没有相等的,则new一个entry对象,加到链表的末尾。
(3)如果拿对象作为key的话。一定要重写这个对象的hashcode方法和equals方法。确保存储和查找正常。
(4)不同的对象hascode可能会相同,因此一定要重写equals方法。
二:ConcurrentHashMap
--->底层是一个Segment<K,V>[]数组。先对key进行hash运算,得到segment数组的下标,然后将数据存放到segment对象内部的HashEntry数组中去。这个存放和hasMap就一致了。
--->Segment<K,V>对象又是继承重入锁的ReentrantLock的对象。
--->每个Segment元素内部又存储了一个HashEntry<K,V>[]数组
--->将来每个key-value对是转化成HashEntry对象。
--->HashEntry的结构又是单向链表结构
--->该类利用了Unsafe类提供的cas操作和线程锁的方法。实现线程安全和高效。所谓的分段锁技术,就是将元素存储在多个容器中,每个容器都有自己的一把锁。将单个锁的压力分摊给多个锁。大大减少了互斥的发生。又因为没有使用synchronized的重量级锁。使用的是并发包的锁机制。而并发包的锁机制,依赖的是jdk的unsafe类提供的原子操作,和线程阻塞技术实现的同步。
--->存的时候使用了锁。
--->读的时候利用的unsafe提供的voliate语意直接读取内存的方法。
static final class HashEntry<K,V> {
final int hash;
final K key;
volatile V value;
volatile HashEntry<K,V> next;
HashEntry(int hash, K key, V value, HashEntry<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
}
java多线程:并发包中ConcurrentHashMap和jdk的HashMap的对比的更多相关文章
- Java多线程_并发容器ConcurrentHashMap/CopyOnWriteArrayList/CopyOnWriteArraySet
ConcurrentHashMap HashMap是线程不安全的,可以使用Collections.synchronizedMap(map)把一个不安全的map变成安全的,但是这里可以直 ...
- Java 多线程查找文件中的内容
学过了操作系统,突然不知道多线程有什么用了. 看了一下百度,发现多线程,可以提升系统利用率 在系统进行IO操作的时候,CPU可以处理一些其他的东西,等IO读取到内存后,CPU再处理之前的操作. 总之可 ...
- java多线程向数据库中加载数据
读取本地文件,每行为一条记录,文件大小550M,200万条数据.先将文件读取的内存中,再开启6个线程连接postgresql不同coordinator端口导入数据.代码如下: import java. ...
- java 多线程 2 Thread中start()和run()的区别
- java多线程并发编程中的锁
synchronized: https://www.cnblogs.com/dolphin0520/p/3923737.html Lock:https://www.cnblogs.com/dolphi ...
- Java并发包中Semaphore的工作原理、源码分析及使用示例
1. 信号量Semaphore的介绍 我们以一个停车场运作为例来说明信号量的作用.假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦.以后 ...
- Java多线程(四)java中的Sleep方法
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- java 多线程总结篇4——锁机制
在开发Java多线程应用程序中,各个线程之间由于要共享资源,必须用到锁机制.Java提供了多种多线程锁机制的实现方式,常见的有synchronized.ReentrantLock.Semaphore. ...
- Java多线程并发05——那么多的锁你都了解了吗
在多线程或高并发情境中,经常会为了保证数据一致性,而引入锁机制,本文将为各位带来有关锁的基本概念讲解.关注我的公众号「Java面典」了解更多 Java 相关知识点. 根据锁的各种特性,可将锁分为以下几 ...
随机推荐
- Bootstrap非常简单实用的web前端开发框架
今天无意间用firebug看网站的代码发现了Bootstrap,之前从来没有听说过这个东东,于是对它产生了好奇感,通过百度我了解到了Bootstrap是一款非常简单,强悍,实用,移动设备端优先使用的这 ...
- Visual Studio Ultimate 2013 with Update 4
Visual Studio Ultimate 2013 with Update 4 是一个先进的开发解决方案,各种规模的团队通过它均可设计和创建引人注目的应用程序,使用户兴致勃勃. Visual St ...
- javaweb-c3p0
//c3p0-config.xml <?xml version="1.0" encoding="UTF-8"?><c3p0-config> ...
- Ubuntu11.10 更新软件源source.list (ZT)
添加完列表后执行 sudo apt-get update sudo apt-get upgrade --------添加列表------------------------------------- ...
- Python OpenCV——Image
最近看MATLAB有点看不下去...就忍不住回到python的怀抱.研究下OpenCV,就当放松啦,对视觉还是很感兴趣的. 这里和之后代码大部分是来自这里的文档. 首先是对图片的处理. ''' imp ...
- 爬虫再探实战(三)———爬取动态加载页面——selenium
自学python爬虫也快半年了,在目前看来,我面临着三个待解决的爬虫技术方面的问题:动态加载,多线程并发抓取,模拟登陆.目前正在不断学习相关知识.下面简单写一下用selenium处理动态加载页面相关的 ...
- Swift URL Schemes使用
URL Schemes通常用于分享和第三方登录,但有时需要在html跳至APP,或者APP跳至另外一个APP.这时也需要使用URL Schemes. 一.html跳转至APP eg:html跳转至te ...
- Java 集合深入理解(6):AbstractList
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情比天蓝,来学学 AbstractList 吧! 什么是 AbstractList AbstractList 继承自 ...
- Unity3D ShaderLab 模拟精灵动画
Unity3D ShaderLab 模拟精灵动画 在上一篇,介绍了通过Shader 模拟纹理运动,那么更深一步讲,我们也可以把帧动画的精灵纹理运动通过shader实现. 虽然大家都是在游戏脚本中做更高 ...
- PHP 调用oracle存储过程
$orderdate = strtotime($this->input->get('orderdate')); $today = strtotime(date('Y-m-d',time() ...