concurrenthashmap

Java并发编程:并发容器之ConcurrentHashMap

孤者浪人 提交于 2019-12-16 17:31:04
Java并发编程:并发容器之ConcurrentHashMap    下面这部分内容转载自:    http://www.haogongju.net/art/2350374   JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都 串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开 始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vector和Hashtable、 Collections.synchronizedXxx()同步容器等相比,util.concurrent中引入的并发容器主要解决了两个问题: 1)根据具体场景进行设计,尽量避免synchronized,提供并发性。 2)定义了一些并发安全的复合操作,并且保证并发环境下的迭代操作不会出错。   util.concurrent中容器在迭代时,可以不封装在synchronized中,可以保证不抛异常,但是未必每次看到的都是"最新的、当前的"数据。   下面是对并发容器的简单介绍:   ConcurrentHashMap代替同步的Map(Collections.synchronized(new HashMap

Java并发编程:并发容器之ConcurrentHashMap

戏子无情 提交于 2019-12-16 16:10:26
转载: Java并发编程:并发容器之ConcurrentHashMap   JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vector和Hashtable、Collections.synchronizedXxx()同步容器等相比,util.concurrent中引入的并发容器主要解决了两个问题: 1)根据具体场景进行设计,尽量避免synchronized,提供并发性。 2)定义了一些并发安全的复合操作,并且保证并发环境下的迭代操作不会出错。   util.concurrent中容器在迭代时,可以不封装在synchronized中,可以保证不抛异常,但是未必每次看到的都是"最新的、当前的"数据。   下面是对并发容器的简单介绍:   ConcurrentHashMap代替同步的Map(Collections.synchronized(new HashMap())),众所周知,HashMap是根据散列值分段存储的,同步Map在同步的时候锁住了所有的段

Java集合框架常见面试题

给你一囗甜甜゛ 提交于 2019-12-16 14:56:15
点击关注 公众号 及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。 剖析面试最常见问题之Java基础知识 说说List,Set,Map三者的区别? Arraylist 与 LinkedList 区别? 补充内容:RandomAccess接口 补充内容:双向链表和双向循环链表 ArrayList 与 Vector 区别呢?为什么要用Arraylist取代Vector呢? 说一说 ArrayList 的扩容机制吧 HashMap 和 Hashtable 的区别 HashMap 和 HashSet区别 HashSet如何检查重复 HashMap的底层实现 JDK1.8之前 JDK1.8之后 HashMap 的长度为什么是2的幂次方 HashMap 多线程操作导致死循环问题 ConcurrentHashMap 和 Hashtable 的区别 ConcurrentHashMap线程安全的具体实现方式/底层具体实现 JDK1.7(上面有示意图) JDK1.8 (上面有示意图) comparable 和 Comparator的区别 Comparator定制排序 重写compareTo方法实现按年龄来排序 集合框架底层数据结构总结 Collection 1. List 2. Set Map 如何选用集合? 剖析面试最常见问题之Java基础知识

ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)

☆樱花仙子☆ 提交于 2019-12-15 07:14:37
哈希表 1.介绍 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。 哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。 2.链式哈希表 链式哈希表从根本上说是由一组链表构成。每个链表都可以看做是一个“桶”,我们将所有的元素通过散列的方式放到具体的不同的桶中。插入元素时,首先将其键传入一个哈希函数(该过程称为哈希键),函数通过散列的方式告知元素属于哪个“桶”,然后在相应的链表头插入元素。查找或删除元素时,用同们的方式先找到元素的“桶”,然后遍历相应的链表,直到发现我们想要的元素。因为每个“桶”都是一个链表,所以链式哈希表并不限制包含元素的个数。然而,如果表变得太大,它的性能将会降低。 3.应用场景 我们熟知的缓存技术(比如redis、memcached)的核心其实就是在内存中维护一张巨大的哈希表,还有大家熟知的HashMap、CurrentHashMap等的应用。 ConcurrentHashMap与HashMap等的区别 1.HashMap 我们知道HashMap是线程不安全的,在多线程环境下,使用Hashmap进行put操作会引起死循环

Will value objects in a copy of a static ConcurrentHashMap reference the same value objects as the original?

落爺英雄遲暮 提交于 2019-12-13 20:09:14
问题 I have a two part question. I have: private static ConcurrentHashMap<Integer, Servers> servers= null; which I later populate. In method getAllServers , I'm doing this: public static synchronized ConcurrentHashMap<Integer, Server> getAllServers() { ConcurrentHashMap<Integer, Server> toReturn = new ConcurrentHashMap<>(); for(Integer i = 0; i < servers.size(); i ++ ) { Server s = servers.get(i); if(s.isAlive()) { s.incrementConns(); toReturn.put(i, s); } } return toReturn; } Q: Will

Adding concurrency with iterating over a collection, mapping to multiple hash maps and reducing to one

纵然是瞬间 提交于 2019-12-13 10:51:35
问题 Have a specific use case and not too sure of the best approach. So the current approach right now is that I'm iterating over a collection of objects (closeable iterator) and mapping them in a hashmap (dealing with conflicts appropriately, comparing by an object's date property). I'm looking for a parallel approach to speed things up and the initial idea was to use Java 8 streams with parallel and forEach utilizing a concurrent hashmap to enable concurrency. The main bottleneck with this

How does ConcurrentLinkedHashMap.Builder handles deletions and get?

喜夏-厌秋 提交于 2019-12-13 03:01:01
问题 I use ConcurrentLinkedHashMap as LRUCache and I'm curious how it handles .get after deletion of a key (because we'll eventually have to remove keys from LRUCache due to its policy. entityLRUCache = new ConcurrentLinkedHashMap.Builder<GUID, Entity>() .maximumWeightedCapacity(100) .build(); ... Entity getEntity(GUID entityId) { if (entityLRUCache.containsKey(entityId)) { // Question: what if key gets deleted from other // thread (when we jumped into this if statement) // and then we'll try to

ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)

人走茶凉 提交于 2019-12-12 22:51:24
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 哈希表 1.介绍 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。 哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。 2.链式哈希表 链式哈希表从根本上说是由一组链表构成。每个链表都可以看做是一个“桶”,我们将所有的元素通过散列的方式放到具体的不同的桶中。插入元素时,首先将其键传入一个哈希函数(该过程称为哈希键),函数通过散列的方式告知元素属于哪个“桶”,然后在相应的链表头插入元素。查找或删除元素时,用同们的方式先找到元素的“桶”,然后遍历相应的链表,直到发现我们想要的元素。因为每个“桶”都是一个链表,所以链式哈希表并不限制包含元素的个数。然而,如果表变得太大,它的性能将会降低。 3.应用场景 我们熟知的缓存技术(比如redis、memcached)的核心其实就是在内存中维护一张巨大的哈希表,还有大家熟知的HashMap、CurrentHashMap等的应用。 ConcurrentHashMap与HashMap等的区别 1.HashMap 我们知道HashMap是线程不安全的

Clear elements from ConcurrentHashMap while iterating

泪湿孤枕 提交于 2019-12-12 20:06:01
问题 Here is my test for ConcurrentHashMap @Test public void testIt2() { Map<String, String> map = new ConcurrentHashMap<String, String>(); map.put("2", "2"); map.put("1", "1"); for (Entry<String, String> entry : map.entrySet()) { map.clear(); System.out.println(entry.getKey()); } } the output is : 1 2 why? 回答1: You can see the changes after the loop ends. You could print out the map again to see the difference. It will be empty. I would like to add a part of @waldheinz's answer: What happens if

Sorting the values in a java ConcurrentHashMap

僤鯓⒐⒋嵵緔 提交于 2019-12-12 17:05:00
问题 I have the following code for sorting a ConcurrentHashMap: ConcurrentHashMap<String,String> text = new ConcurrentHashMap<String,String>(); .... List<String> list = new ArrayList<String>(text.values()); Collections.sort(list); Which throws a NoSuchElementException: Caused by: java.util.NoSuchElementException at library.ArrayList$Itr.next(ArrayList.java:1232) at library.ArrayList$ListItr.next(ArrayList.java:1263) at java.util.Collections.sort(Collections.java:120) And I can't work out why. Any