一.关于分段锁 集合框架很大程度减少了java程序员的重复劳动,然而,在Java多线程环境中,以线程安全的方式使用集合类是一个首先考虑的问题. 越来越多的程序员了解到了ConcurrentHashMap,都知道它内部使用了分段锁.然而,随着Java语言的快速发展,分段锁已经是历史了. 在Java8中,你看不到分段锁的身影.Java7中,Segment继承于ReentrantLock使用了显示锁,在Segment的实例方法中,每个更新操作内部又使用Unsafe来处理更新.这显然是一种浪费.显示锁.…
JAVA7 Java7的ConcurrentHashMap里有多把锁,每一把锁用于其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率呢.这就是“锁分离”技术. ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成.Segment是一种可重入锁(继承了ReentrantLock),在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据. ConcurrentHa…
一:Java7 中的HashMap 结构: HashMap 里面是一个数组,然后数组中每个元素是一个单向链表.链表中每个元素称为一个Entry 实例,Entry 包含四个属性:key, value, hash 值和用于单向链表的 next. 属性: capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍. loadFactor:负载因子,默认为 0.75. threshold:扩容的阈值,等于 capacity * loadFactor (一)put操作大概过…
Java7 中 ConcurrentHashMap ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一些. 整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表"部分"或"一段"的意思,所以很多地方都会将其描述为分段锁.注意,行文中,我很多地方用了"槽"来代表一个 segment. 简单理解就是,ConcurrentHashMap 是一个 Segm…
Java5: 1.泛型 Generics:        引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数和返回值,Generic是vararg.annotation.enumeration.collection的基石. A.类型安全 抛弃List.Map,使用List<T>.Map<K,V>给它们添加元素或者使用Iterator<T>遍历时,编译期就可以给你检查出类型错误 B…
java7 新特性: 1. switch 里面的 case 条件可以使用字符串了. 2. 运用 List\tempList = new ArrayList<>(); 即泛型实例化类型自动判断. java8 新特性: 1. java8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可. 2. lambda 表达式   其实就是 for 循环代码的简化版,效率更高了................…
以下来至网址: http://blog.csdn.net/samjustin1/article/details/52268004 Java7 新特性 1.switch中可以使用字符串了 String s = "test"; switch (s) { case "test" : System.out.println("test"); case "test1" : System.out.println("test1&qu…
最近工作中碰到个新需求,计算每个员工入职公司的时长,要求形式为多少年多少月多少天形式,某个值为0就跳过不显示,因为前段时间学习过java8新特性,对于这个需求,java8的新时间日期API可以直接解决: 不得不感叹java8的强大,但是很遗憾,项目的服务端使用的jdk仍然是1.7(汗......java10都发布了),所以还是得自己动手来,刚开始使用的是日历API方式,通过加减计算,得出的结果,参考了百度的答案,如下图: , 但是后来测试发现这种方式有很大的问题,计算的值不仅可能为0,还有可能为…
在多个java编译环境中,有时需要java 7,有时又需要java 8,怎么配置java 环境,可以快速自动切换呢?下面用mac演示在 /etc/bashrc 中配置的环境变量 # 设置 JDK export JAVA_7_HOME=`/usr/libexec/java_home -v 1.7` # 设置 JDK export JAVA_8_HOME=`/usr/libexec/java_home -v 1.8` #默认JDK export JAVA_HOME=$JAVA_8_HOME #ali…
作者:RednaxelaFX链接:https://www.zhihu.com/question/28414001/answer/40733996来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. “不保证有序”和“保证无序”不等价,HashSet的iterator是前者而不是后者,所以在一次运行中看到有序的结果也是正常的,但不能依赖这个有序行为.况且HashSet并不关心key的“排序”,就算其iterator“有序”通常也是说“按元素插入顺序”(LinkedHash…
win7 系统,同时安装了JDK7和JDK8,卸载了JDK8之后,cmd命令行输入:java -version ,本以为显示java版本1.7,结果弹错:has value '1.7',but '1.8' is required. 我查看JAVA_HOME,环境变量,发现也没有问题,指向的是C:\Java\jdk1.7.0 解决方法: 由于安装完JDK7之后,安装了JDK8,因为在安装JDK1.8时,自动将java.exe.javaw.exe.javaws.exe三个可执行文件复制到了C:\Wi…
个人简介 ​ Java后台开发方向. 非计算机专业硕士,专业涉及到一些开发. 实验室项目主要是Java Web系统,挖掘小亮点. 无实习经验. 闲话唠嗑 ​ 回顾这几个月,宛若梦一场. 一开始心态不好,看到要学习的东西一大堆,沉不下心来学习,看什么东西都是看着看着就很浮躁,开始疯狂抖腿,沉迷幻想,以为找工作只看少量面经重点即可. 实验室原因无法实习,四五月份春招的时候参加了阿里和网易的实习招聘提前感受面试,惨败.可以说是一塌糊涂.当头一棒,脑子清醒了,既然想要从事互联网行业,早学晚学还是要学,不…
如果让你看一篇文章,就可以精通HashMap,成为硬刚才面试官的高手,你学还是不学? 别着急,开始之前不如先尝试回来下面几个问题吧: HashMap的底层结构是什么? 什么时候HashMap中的链表会转化为红黑树? 为什么当链表长度超过8个时候会转化成红黑树?这为什么是8个而不是3个呢? HashMap是线程安全的嘛? HashMap为什么是线程不安全的?有哪些具体体现? ConcurrentHashMap和HashTable是如何实现线程安全的呢?有何不同呢? 一.HashMap底层结构是什么…
java.util.concurrent 包是在 Java5 时加入的,与 concurrent 的相关的有 JMM及 AbstractQueuedSynchronizer (AQS),两者是实现 concurrent 的基础,下面我们来看一下 1 JMM JMM 是 Java Memory Model,围绕着并发过程中如何处理可见性.原子性.有序性这三个特征而建立的模型. 1.1 主内存和工作内存 JMM 中规定了所有变量都储存在主内存中,每条线程都有自己的工作内存(类似处理器的高速缓存),线…
跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽.切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的轨迹),还是钱给少了,不受重视. 准备不充分的面试,完全是浪费时间,更是对自己的不负责(如果title很高,当我没说). 今天给大家分享我在这次"金九银十"期间跳槽面试的几个大厂经历,总结了这次跳槽中整理的Java面试合集,其中大部分都是这次面试过程中的面试题,可以对照这查漏补缺. 天猫…
5G的到来证明了互联网行业发展一如既往的快,作为一名开发人员(Java岗)梦想自然是互联网行业的大厂,这次我的一个学员拿到了杭州的一个研究院offer,透露一下,年薪50多万,保底16,在这里分享一拨面试过程! 一面 自我介绍,主要讲讲做了什么和擅长什么 设计模式了解哪些? AtomicInteger怎么实现原子修改的? ConcurrentHashMap 在Java7和Java8中的区别?为什么Java8并发效率更好?什么情况下用HashMap,什么情况用ConcurrentHashMap?…
目录 一.ConcurrentHashMap的模型图 二.源码分析-类定义 2.1 极简ConcurrentHashMap定义 2.2 Segment内部类 2.3 HashEntry内部类 2.4 ConcurrentHashMap的重要常量 三.常用接口源码分析 3.1 ConcurrentHashMap构造方法 3.2 map.put操作 3.3 创建新segment 3.4 segment.put操作 3.5 segment.rehash扩容 3.6 map.get操作 3.7 map.…
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 今天发一篇”水文”,可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍.本来以为花不了多少时间的,不过最终还是投入了挺多时间来完成这篇文章的. 网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少,不过缺斤少两的文章比较多,所以才想自己也写一篇,把细节说清楚说透,尤其像 Java8 中的 ConcurrentHashMap,大部分文章都说不清楚.终归是希望…
大家可能平时用HashMap比较多,相对于ConcurrentHashMap 来说并不是很熟悉.ConcurrentHashMap 是 JDK 1.5 添加的新集合,用来保证线程安全性,提升 Map 集合的并发效率.ConcurrentHashMap 使用了 Segment 的概念,默认有 16 个 Segment(段,块,部分),Segment 里面依然还是数组 + 链表的数据结构,相当于给 HashMap 分桶处理了.因每次只会锁住其中一个 Segment,所以性能非常好.然而,有意思的是,…
网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少,不过缺斤少两的文章比较多,所以才想自己也写一篇,把细节说清楚说透,尤其像 Java8 中的 ConcurrentHashMap,大部分文章都说不清楚.终归是希望能降低大家学习的成本,不希望大家到处找各种不是很靠谱的文章,看完一篇又一篇,可是还是模模糊糊. 阅读建议:四节基本上可以进行独立阅读,建议初学者可按照 Java7 HashMap -> Java7 ConcurrentHashMap -> Java8 Ha…
阅读前提:本文分析的是源码,所以至少读者要熟悉它们的接口使用,同时,对于并发,读者至少要知道 CAS.ReentrantLock.UNSAFE 操作这几个基本的知识,文中不会对这些知识进行介绍.Java8 用到了红黑树,不过本文不会进行展开,感兴趣的读者请自行查找相关资料. Java7 HashMap HashMap 是最简单的,一来我们非常熟悉,二来就是它不支持并发操作,所以源码也非常简单. 首先,我们用下面这张图来介绍 HashMap 的结构. 这个仅仅是示意图,因为没有考虑到数组要扩容的情…
引入ConcurrentHashMap 模拟使用hashmap在多线程场景下发生线程不安全现象 import java.util.HashMap; import java.util.Map; import java.util.UUID; /** * 模拟hashmap在多线程场景下的出现的不安全现象之一 * hashmap还有put丢失,jdk1.7扩容成环的问题 */ public class Demo2 { public static void main(String[] args) { M…
Java7 HashMap  数组+链表 Java7 ConcurrentHashMap   Segment数组+HashEntry数组链表+ReenTrantLock分段锁 Java8 HashMap  链表Node数组+红黑树TreeNode数组(链表大于8时转换) Java8 ConcurrentHashMap   链表Node数组+红黑树TreeNode数组+Synchronized同步锁 Java7 HashMap HashMap 是最简单的,一来我们非常熟悉,二来就是它不支持并发操作…
HashMap的线程不安全主要体现在resize时的死循环及使用迭代器时的fast-fail上. Fast-fail: fail-fast 机制是java集合(Collection)中的一种错误机制.当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件. 在使用迭代器的过程中如果HashMap被修改,那么ConcurrentModificationException将被抛出,也即Fast-fail策略. 当HashMap的iterator()方法被调用时,会构造并返回一个新…
在多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈建议使用ConcurrentHashMap代替HashMap. HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占,相当于所有线程进行读写时都去竞争一把锁,导致效率非常低下.ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,允许多个修改操作…
平时大家都会经常使用到 Map,面试的时候又经常会遇到问Map的,其中主要就是 ConcurrentHashMap,在说ConcurrentHashMap.我们还是先看一下, 其他两个基础的 Map 类: HashMap  和 TreeMap HashMap: public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable,Serializable { // 这里有个很逗…
①引言(为什么要使用ConcurrentHashMap) 因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap. HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下.因为当一个线程访问HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态.如线程1使用put进行添加元素,线程2不但不能使用put方法添…
       本文部分照片和代码分析来自文末参考资料        java8中的concurrenthashmap的方法逻辑和注解有些问题,建议看最新的JDK版本        建议阅读 concurrenthashmap 源码前过一遍源码前面的注释,参考资料第二篇的博客有注释翻译 概述 java8 的 concurrenthashmap 主要工作方式如下 : 可以看到总体就是链表+红黑树.当链表数量达到一定值(默认是8)时,我们就会将链表转化为红黑树.concurrenthash的特点就是并…
参考自:http://www.importnew.com/28263.html HaspMap和ConcurrentHashMap(康科瑞特哈希迈普) Java7 HashMap 不支持并发操作,HashMap 里面是一个数组,然后数组中每个元素是一个单向链表. capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍. loadFactor:负载因子,默认为 0.75. threshold:扩容的阈值,等于 capacity * loadFactor put…
关于JAVA8学习的意义先来贴一下某网站上的对它的简单介绍:“Java 8可谓Java语言历史上变化最大的一个版本,其承诺要调整Java编程向着函数式风格迈进,这有助于编写出更为简洁.表达力更强,并且在很多情况下能够利用并行硬件的代码.Java 8所带来的函数式编程特性使得Java从此屹立于函数式编程的世界,这是Java这门“古老的”编程语言自从发布以来变化最大的一个版本,在很多地方从根本上改变了我们编码的方式,使得Java也可以像Scala.Python.JavaScript等函数式编程语言一…