concurrenthashmap

深入分析ConcurrentHashMap

亡梦爱人 提交于 2019-12-02 05:19:39
术语定义 术语 英文 解释 哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。 哈希表 hash table 根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。 线程不安全的HashMap 因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap,如以下代码 final HashMap<String, String> map = new HashMap<String, String>(2); Thread t = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10000; i++) { new Thread(new Runnable() { @Override public void run() { map.put(UUID.randomUUID().toString(), ""); } }, "ftf" + i).start(); } } }, "ftf"); t.start(); t

ConcurrentHashMap 、HashTable

梦想与她 提交于 2019-12-02 05:19:14
java集合类中非线程安全的集合可以用同步包装器使集合变成线程安全,比如: HashMap --> Collections.synchronizedMap(new HashMap()), 那如果比较Collections.synchronizedMap(new HashMap())和HashTable的话, 哪个的效率更高呢?类似的对应集合(HashMap-HashTable)还有哪些呢,每个 的效率又如何呢? 其实Java集合用到了很多的数据结构,用不同的数据结构实现的Java集合类,当然在不同的场合中使用有不同的性能表现;下面简单说说你提到的这两个类似的java集合类在多线程下的效率问题(一般都是时间方面): 首先 Collections.synchronizedMap(new HashMap())和HashTable 都是同步集合,Collections.synchronizedMap采用的同步块实现,HashTable采用的是同步方法实现,在多线程环境下,一般认为是同步块好于同步方法 ; 其次,说到多线程,那线程安全是很重要的,这两个同步集合对于一些常见的简单操作:如put, remove, get等,线程安全对于单个操作来说是没什么问题的,但对于一些复合操作来说,如同时put和remove,迭代等,要保证线程安全,就必须在使用时 同步加锁 了,也就是确保像

Counting the number of exceptions happening in catch block

一笑奈何 提交于 2019-12-02 03:55:24
I am trying to collect all the counts of exception happening and the name of exception in a ConcurrentHashMap so that I should be aware of how many times this exception has occurred. So in my catch block I have map that will keep on adding the name of exception and there total count occurrence. Below is my code which I have modified to always throw SQL Exception everytime for the testing purpose so that I can see the count of exception is accurate or not. So certain scenario- 1) If I am choosing number of threads as 10 and number of tasks as 50 , then in that map, I can see 500 exception for

Why ConcurrentHashMap cannot be locked for exclusive access?

旧街凉风 提交于 2019-12-02 00:07:16
问题 A quote from #JCIP : "Since a ConcurrentHashMap cannot be locked for exclusive access, we cannot use client-side locking to create new atomic operations such as put-if-absent, as we did for Vector" Why we can't just acquire the lock in order to implement additional atomic methods and keep the collection thread-safe (like synchronized collections returned by Collections.synchronizedxxx factory) : 回答1: Why? Because the implementation does not support it. Straight from the ConcurrentHashMap

Why ConcurrentHashMap cannot be locked for exclusive access?

不羁岁月 提交于 2019-12-01 22:11:53
A quote from #JCIP : "Since a ConcurrentHashMap cannot be locked for exclusive access, we cannot use client-side locking to create new atomic operations such as put-if-absent, as we did for Vector" Why we can't just acquire the lock in order to implement additional atomic methods and keep the collection thread-safe (like synchronized collections returned by Collections.synchronizedxxx factory) : Why? Because the implementation does not support it. Straight from the ConcurrentHashMap JavaDocs: There is not any support for locking the entire table in a way that prevents all access ...which is,

Does a concurrent hashmap not require synchronized getters/setters?

走远了吗. 提交于 2019-12-01 21:26:39
问题 If i was using a concurrent hashmap and i had methods which set and got values, as im using a concurrent hashmap would i need to make the getter and setter synchronized? Is this redundant? Is one design better? Also, is a concurrent hashmap without synchronization faster than a hashmap with synchronized getters and setters? This is for a high performance system Thank you 回答1: java.util.concurrent.ConcurrentHashMap is thread safe It is faster than using synchronized(object) You still need to

HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别

纵然是瞬间 提交于 2019-12-01 19:30:50
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别 ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。 当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。 因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。 ②HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。 HashMap几乎可以等价于Hashtable

源码分析 HashTable与CurrentHashMap1.7与currentHashMap1.8对比

百般思念 提交于 2019-12-01 19:05:34
HashTable    jdk1.7currentHashMap jdk1.8currentHashMap    ConcurrentHashMap线程安全的具体实现方式/底层具体实现     JDK1.7(上面有示意图)        首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的     数据也能被其他线程访问。     ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成 。     Segment 实现了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色。HashEntry 用于存储键值对数据。     static class Segment<K,V> extends ReentrantLock implements Serializable {     }     一个 ConcurrentHashMap 里包含一个 Segment 数组。Segment 的结构和HashMap类似,是一种数组和链表结     构, 一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个     HashEntry数组里的元素,当对 HashEntry

基于Java并发容器ConcurrentHashMap#put方法解析

为君一笑 提交于 2019-12-01 12:58:05
jdk1.7.0_79 HashMap可以说是每个Java程序员用的最多的数据结构之一了,无处不见它的身影。关于HashMap,通常也能说出它不是线程安全的。这篇文章要提到的是在多线程并发环境下的HashMap——ConcurrentHashMap,显然它必然是线程安全的,同样我们不可避免的要讨论散列表,以及它是如何实现线程安全的,它的效率又是怎样的,因为对于映射容器还有一个Hashtable也是线程安全的但它似乎只出现在笔试、面试题里,在现实编码中它已经基本被遗弃。 关于 HashMap的线程不安全,在多线程并发环境下它所带来的影响绝不仅仅是出现脏数据等数据不一致的情况, 严重的是它有可能带来程序死循环 ,这可能有点不可思议,但确实在不久前的项目里同事有遇到了 CPU100%满负荷运行,分析结果是在多线程环境下HashMap导致程序死循环。对于Hashtable,查看其源码可知,Hashtable保证线程安全的方式就是利用synchronized关键字,这样会导致效率低下,但对于ConcurrentHashMap则采用了不同的线程安全保证方式—— 分段锁 。它不像 Hashtable那样将整个table锁住而是将数组元素分段加锁,如果线程1访问的元素在分段segment1,而线程2访问的元素在分段segment2,则它们互不影响可以同时进行操作。如果合理的进行分段就是其关键问题。

volatile, synchronized, 读写屏障,CONCURRENTHASHMAP

血红的双手。 提交于 2019-12-01 12:07:54
Java 理论与实践: 构建一个更好的 HashMap ConcurrentHashMap 如何在不损失线程安全的同时提供更高的并发性 Brian Goetz , 首席顾问, Quiotix Corp Brian Goetz 是一名软件顾问,在过去的 15 年里,他一直是一名专业软件开发人员。他是 Quiotix 的首席顾问,Quiotix 是一家位于加尼福利亚州洛斯拉图斯(Los Altos)市的软件开发与咨询公司。请在业界流行的出版物中查阅 Brian 的 已出版和即将出版的文章 。 简介: ConcurrentHashMap 是 Doug Lea 的 util.concurrent 包的一部分,它提供比 Hashtable 或者 synchronizedMap 更高程度的并发性。而且,对于大多数成功的 get() 操作它会设法避免完全锁定,其结果就是使得并发应用程序有着非常好的吞吐量。这个月,Brian Goetz 仔细分析了 ConcurrentHashMap 的代码,并探讨 Doug Lea 是如何在不损失线程安全的情况下取得这么骄人成绩的。请在 讨论论坛 上与作者及其他读者共享您对本文的一些想法(也可以在文章的顶部或底部点击 讨论 来访问论坛)。 查看本系列更多内容 本文的标签: concurrenthashmap , hashmap , java , 构建一个更好的