concurrenthashmap

五分钟学后端技术:如何学习Redis、memcache等常用缓存技术

[亡魂溺海] 提交于 2020-03-27 19:08:54
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类缓存组件,或者是本地缓存,来实现一些后端的应用。 那么,严格来说,到底什么才是缓存呢,先来看看百度百科的定义。 缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。 最早,“缓存”一词是用来指代计算机硬件中的高速缓存,因为CPU和内存的运算速度差距过大,如果CPU直接和内存交互的话,会浪费掉CPU的大量运算时间,于是有了高速缓存,来为这两个速度差距甚远的组件做中介。 具体的工作原理是,CPU要取数据的时候,先找高速缓存要,由于它们俩的速度差距并不大,所以CPU不会损失掉太多性能,如果数据就在缓存中,那么就直接在缓存里取,否则则到内存去取,取完之后还要留在高速缓存中,以便于下次CPU要使用时无需再到内存中去取。 其实,高速缓存还可以分为一级缓存,二级缓存和三级缓存等,每往下一级,速度也就越慢,价格也越低,毕竟,成本是我们不得不考虑的因素,要不然一切硬件都上顶配,就不需要讨论软件的优化了。 除了高速缓存外,其实还有硬盘缓存

五分钟学后端技术:如何学习Redis、memcache等常用缓存技术

喜欢而已 提交于 2020-03-27 19:00:34
3 月,跳不动了?>>> 原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类缓存组件,或者是本地缓存,来实现一些后端的应用。 那么,严格来说,到底什么才是缓存呢,先来看看百度百科的定义。 缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。 最早,“缓存”一词是用来指代计算机硬件中的高速缓存,因为CPU和内存的运算速度差距过大,如果CPU直接和内存交互的话,会浪费掉CPU的大量运算时间,于是有了高速缓存,来为这两个速度差距甚远的组件做中介。 具体的工作原理是,CPU要取数据的时候,先找高速缓存要,由于它们俩的速度差距并不大,所以CPU不会损失掉太多性能,如果数据就在缓存中,那么就直接在缓存里取,否则则到内存去取,取完之后还要留在高速缓存中,以便于下次CPU要使用时无需再到内存中去取。 其实,高速缓存还可以分为一级缓存,二级缓存和三级缓存等,每往下一级,速度也就越慢,价格也越低,毕竟,成本是我们不得不考虑的因素,要不然一切硬件都上顶配,就不需要讨论软件的优化了。

ConcurrentHashMap --- 第一 cas 操作数组元素

这一生的挚爱 提交于 2020-03-27 15:51:31
首先贴 java 8 中实现的源代码 1 /** Implementation for put and putIfAbsent */ 2 final V putVal(K key, V value, boolean onlyIfAbsent) { 3 if (key == null || value == null) throw new NullPointerException(); 4 int hash = spread(key.hashCode()); 5 int binCount = 0; 6 for (Node<K,V>[] tab = table;;) { 7 Node<K,V> f; int n, i, fh; 8 if (tab == null || (n = tab.length) == 0) // 第一次使用时,整个 table 为 null 9 tab = initTable(); 10 else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) { 11 if (casTabAt(tab, i, null, 12 new Node<K,V>(hash, key, value, null))) 13 break; // no lock when adding to empty bin 14 } 15 else

Java Map

拥有回忆 提交于 2020-03-26 18:55:30
Map无论在Java编程或者面试中,都占用很重要的地位,这里试图聊聊相关的概念,看看是否能够理清楚相关的思路。 HashMap HashMap 是我们经常会用到的集合类,JDK 1.7 之前底层使用了数组加链表的组合结构,如下图所示: 新添加的元素通过取模的方式,定位 Table 数组位置,然后将元素加入链表头部,这样下次提取时就可以快速被访问到。 访问数据时,也是通过取模的方式,定位数组中的位置,然后再遍历链表,依次比较,获取相应的元素。 如果 HasMap 中元素过多时,可能导致某个位置上链表很长。原本 O(1) 查找性能,可能就退化成 O(N) ,严重降低查找效率。 为了避免这种情况,当 HasMap 元素数量满足以下条件时,将会自动扩容,重新分配元素。 1// size:HashMap 中实际元素数量 2//capacity:HashMap 容量,即 Table 数组长度,默认为:16 3//loadFactor:负载因子,默认为:0.75 4 size>=capacity*loadFactor HasMap 将会把容量扩充为原来的两倍,然后将原数组元素迁移至新数组。 1void transfer(Entry[] newTable, boolean rehash) { 2 int newCapacity = newTable.length; 3 for (Entry<K,V

ConcurrentHashMap原理

不想你离开。 提交于 2020-03-23 21:30:51
转载地址:http://www.blogjava.net/xylz/archive/2010/07/20/326661.html 在上一篇中介绍了HashMap的原理,这一节是ConcurrentMap的最后一节,所以会完整的介绍ConcurrentHashMap的实现。 ConcurrentHashMap原理 在 读写锁章节部分 介绍过一种是用读写锁实现Map的方法。此种方法看起来可以实现Map响应的功能,而且吞吐量也应该不错。但是通过前面对 读写锁原理 的分析后知道,读写锁的适合场景是读操作>>写操作,也就是读操作应该占据大部分操作,另外读写锁存在一个很严重的问题是读写操作不能同时发生。要想解决读写同时进行问题(至少不同元素的读写分离),那么就只能将锁拆分,不同的元素拥有不同的锁,这种技术就是“锁分离”技术。 默认情况下ConcurrentHashMap是用了16个类似HashMap 的结构,其中每一个HashMap拥有一个独占锁。也就是说最终的效果就是通过某种Hash算法,将任何一个元素均匀的映射到某个HashMap的Map.Entry上面,而对某个一个元素的操作就集中在其分布的HashMap上,与其它HashMap无关。这样就支持最多16个并发的写操作。 上图就是ConcurrentHashMap的类图。参考上面的说明和HashMap的原理分析

ConcurrentHashMap源码解析(1.8)

末鹿安然 提交于 2020-03-20 07:58:47
一、简介 上篇文章 详细介绍了HashMap的源码及原理,本文趁热打铁继续分析ConcurrentHashMap的原理。 首先在看本文之前,希望对HashMap有一个详细的了解。不然看直接看ConcurrentHashMap的源码还是有些费劲的。 相信对HashMap,HashTable有一定了解,应该知道HashMap是不具备线程安全性的,在resize时会丢数据(JDK8),而HashTable虽然保证了线程安全性,但是其是通过给每个方法加Synchronized关键字达到的同步目的。但是都知道Synchronized在竞争激烈的多线程并发环境中,在性能上的表现是非常不如人意的。那在高并发环境中HashMap如何保证线程安全而又不浪费太多性能呢?答案就是Java J.U.C并发包中的ConcurrentHashMap。 依然开局一张图。JDK8中的ConcurrentHashMap数据结构。 呃呵,和HashMap的结构是一样的,没错在数据结构层面,ConcurrentHashMap和HashMap是完全一样的。有了这个基础继续往下看。 二、历史版本 ConcurrentHashMap的历史版本大致分界线在JDK8。也就是可以分为JDK8和JDK8以前版本。 数据结构的区别 在JDK8之前HashMap没有引入红黑树,同样的ConcurrentHashMap也没有引入红黑树

Map集合面试题

自闭症网瘾萝莉.ら 提交于 2020-03-16 18:30:51
有可能问道你都知道哪些常用的Map集合?   HashMap、HashTable、LinkedHashMap、ConcurrentHashMap。 Collection集合接口和Map接口有什么关系?   没关系,Collection是List、Set父接口不是Map父接口。 HashMap是线程安全的吗?线程安全的Map都有哪些?性能最好的是哪个?   HashMap不是线程安全的。线程安全的有HashTable、ConcurrentHashMap、SynchronizedMap,性能最好的是ConcurrentHashMap。 使用HashMap有什么性能问题吗?   使用HashMap要注意避免集合的扩容,它会很耗性能,根据元素的数量给它一个初始大小的值。 HashMap的数据结构是怎样的?默认大小是多少?内部是怎么扩容的?   HashMap是数组和链表组成的,默认大小为16,当hashmap中的元素个数超过数组大小*loadFactor(默认值为0.75)时就会把数组的大小扩展为原来的两倍大小,然后重新计算每个元素在数组中的位置。 怎么按添加顺序存储元素?怎么按A-Z自然顺序存储元素?怎么自定义排序?   按添加顺序使用LinkedHashMap,按自然顺序使用TreeMap,自定义排序TreeMap(Comparetor c)。

ConcurrentHashMap总结

不羁的心 提交于 2020-03-09 05:28:16
原文:https://my.oschina.net/hosee/blog/675884 并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O)。ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响,无论对于Java并发编程的学习还是Java内存模型的理解,ConcurrentHashMap的设计以及源码都值得非常仔细的阅读与揣摩。 这篇日志记录了自己对ConcurrentHashMap的一些总结,由于JDK6,7,8中实现都不同,需要分开阐述在不同版本中的ConcurrentHashMap。 之前已经在 ConcurrentHashMap原理分析 中解释了ConcurrentHashMap的原理,主要是从代码的角度来阐述是源码是如何写的,本文仍然从源码出发,挑选个人觉得重要的点(会用红色标注)再次进行回顾,以及阐述ConcurrentHashMap的一些注意点。 1. JDK6与JDK7中的实现 1.1 设计思路

Java集合:Map接口总结

故事扮演 提交于 2020-03-08 11:12:06
一、HashMap 基于哈希表的 Map 接口的实现,允许存入 null 值和 null 键,无序存储且线程不同步; HashMap 初始容量默认为16,扩容一定是2的指数,加载因子默认值为0.75; HashMap采用Iterator方式迭代,可直接迭代键值对; 迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。 建议多看源码,如果觉得晦涩可以戳 这里 看源码解析。 安利网址:http://www.admin10000.com/document/3322.html,个人觉得分析的挺好 JDK1.8+HashMap的改进 JDK1.8以前是采用的数组+链表形式存储,JDK1.8+是采用的是数组+链表/红黑树 JDK1.8+,当bucket节点数小于等于6时,转换为链表形式;当节点数大于等于8时,转换为红黑树形式 JDK1.8以前,HashMap的put()方法、get()源码如下: put(): public V put(K key, V value) { // HashMap允许存放null键和null值。 // 当key为null时,调用putForNullKey方法,将value放置在数组第一个位置。 if (key ==

ConcurrentHashMap 的实现原理

若如初见. 提交于 2020-03-07 08:57:19
概述 我们在之前的博文中了解到关于 HashMap 和 Hashtable 这两种集合。其中 HashMap 是非线程安全的,当我们只有一个线程在使用 HashMap 的时候,自然不会有问题,但如果涉及到多个线程,并且有读有写的过程中,HashMap 就不能满足我们的需要了(fail-fast)。在不考虑性能问题的时候,我们的解决方案有 Hashtable 或者Collections.synchronizedMap(hashMap),这两种方式基本都是对整个 hash 表结构做锁定操作的,这样在锁表的期间,别的线程就需要等待了,无疑性能不高。 所以我们在本文中学习一个 util.concurrent 包的重要成员,ConcurrentHashMap。 ConcurrentHashMap 的实现是依赖于 Java 内存模型,所以我们在了解 ConcurrentHashMap 的前提是必须了解Java 内存模型。但 Java 内存模型并不是本文的重点,所以我假设读者已经对 Java 内存模型有所了解。 ConcurrentHashMap 分析 ConcurrentHashMap 的结构是比较复杂的,都深究去本质,其实也就是数组和链表而已。我们由浅入深慢慢的分析其结构。 先简单分析一下,ConcurrentHashMap 的成员变量中,包含了一个 Segment 的数组( final