1.ConcurrentHashMap

  在并发中使用hashmap容易导致死锁,hashmap存在以下问题

  1.线程不安全的hashmap

    在多线程环境下使用hashmapPut操作时会引起死循环,因为多线程会导致HashMap的Entry链表形成环形数据结构,next节点永远不为控股,就会产生死循环

  2.效率低下的HashTable

    HashTable利用synchronized来保证线程安全,但在竞争情况下会产生阻塞和轮询状态而导致效率降低

  所以根据以上情况ConcurrentHashMap通过锁分段技术来提高并发效率

  将数据进行分段,当一个线程占有占用锁访问其中一个分段数据时,其他都按的数据也能被其它线程访问

 2.ConcurrentHashMap结构

   ConcurrentHashMap由Segment和 HashEntry组成,Segment是可重入锁,HashEntry用于存储键值对数据,一个ConHashMap包含一个Segment数组,每个HashEntry是一个链表结构元素,  

  ConcurrentHashMap结构

3.使用

  初始化通过InitialCapacity,LoadFactor和concurrencyLevel来初始化数组

定位Segemt

    ConcurrentHashMap使用分段锁来保护不同段的数据,所以在插入和获取元素时,需要通过散列算法定位Segement

4.操作ConcurrentHashMap

  4.1get

  

由于将值得共享变量定义为volatile,能够在线程之间保持可见性,能够在多线程时读,并且保证不会读到过期的值在get方法中只需要读不需要写count和value,所以不用加锁,因为JAVA内存的happen-before原则对volatile字段的写入操作先于读操作,所以get能拿到最新的值.

4.2put

  在操作共享变量时必须加锁,PUT首先定位到Segement,然后再Segement执行插入操作,插入操作需判断是否对HashEntry数组是否扩容,在定位元素位置.

4.3Size

  

用于计算ConcurrentHashMap元素大小.

5.ConcurrentLinkedQueue

  线程安全队列,实现安全队列可通过阻塞算法和非阻塞算法,阻塞算法队列通过一个锁和两个锁实现,非阻塞锁通过循环CAS实现。

ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,采用FIFO的规则对结点进行排序,采用WAIT-FREE算法实现,有tail和head节点组成,每个节点指向NEXT的引用组成,节点和节点之间通过next关联

transient:对象序列化时,阻止对象持久化,修饰变量不能持久化

5.1入队列

  将入队节点添加到队列尾部

定位尾节点

  tail节点不总是尾节点,所以每次入队都必须想通过tail节点来找到尾节点.

出队列

出队列从队列返回一个节点元素,并清除该节点对元素的引用

首先获取头节点元素,然后判断节点元素是否存在,不过不为空以CAS方式将头节点的引用设置为NULL,如果CAS成功,则直接返回头节点的元素

5.2.阻塞队列

  阻塞队列支持两个附加操作的队列,两个附加操作支持阻塞插入和移除

  1.但队列满时,队列会阻塞插入元素的线程,直到不满

  2.移除指队列为空时,获取元素的线程会等待队列变为非空.

在JDK7中包含7个阻塞队列如下

 

Queue Detail
ArrayBlockingQueue 利用数组实现的有界队列按照FIFO原则对元素进行排序,默认情况下不保证线程公平的访问队列
LinkedBlockingQueue 用链表实现的有界阻塞队列,此列的默认值和最大长度为Integer.MAX_VALUE,FIFO进行排序
PriorityBlockingQueue 支持优先级的无界阻塞队列,采取顺序升序排列,可以自定实现CompareTo()方法来指定元素排列
DelayQueue 支持延时获取元素的无界阻塞队列,使用PriorityQueue实现,必须实现Delayed接口,利用Delayed实现缓存系统的设计以及定时任务调度.
SynchronusQueue 不存储元素的阻塞队列,每一个put操作必须等待一个take操作,支持公平访问队列,默认情况下线程采用非公平策略访问队列
LinkedTransferQueue 由链表结构组成的无界阻塞TransferQueue队列,
LinkedBlockingDeque 链表结构双向阻塞结构,可以两段插入和移除元素.可以防止过度膨胀,运用在"工作窃取"模式中

l

JAVA CONCURRENT FRAMEWORK的更多相关文章

  1. Java Concurrent Topics

    To prevent Memory Consistency Errors(MCEs), it is good practice to specify synchronized class specif ...

  2. java concurrent包的学习(转)

    java concurrent包的学习(转) http://my.oschina.net/adwangxiao/blog/110188 我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常 ...

  3. java collection framework

    java collection framework Map

  4. 将 Java Spring Framework 应用程序迁移到 Windows Azure

    我们刚刚发布了一个新教程和示例代码,以阐述如何在Windows Azure中使用 Java 相关技术.在该指南中,我们提供了分步教程,说明如何将 Java Spring Framework 应用程序( ...

  5. How to Create a Java Concurrent Program

    In this Document   Goal   Solution   Overview   Steps in writing Java Concurrent Program   Template ...

  6. 【DataStructure】The description of Java Collections Framework

    The Java Connections FrameWork is a group of class or method and interfacs in the java.util package. ...

  7. (一)一起学 Java Collections Framework 源码之 概述

    . . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述 JDK 中很多类 LZ 已经使用了无数次,但认认真真从源码级研究过其原理的还只占少数,虽然从 ...

  8. (二)一起学 Java Collections Framework 源码之 AbstractCollection

    . . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述(未完成) (二)一起学 Java Collections Framework 源码之 Abs ...

  9. Java Collection Framework : List

    摘要: List 是 Java Collection Framework的重要成员,详细包括List接口及其全部的实现类.由于List接口继承了Collection接口,所以List拥有Collect ...

随机推荐

  1. windows dos命令下切换目录

    1.如果我们要访问F盘,只需要输入F: 2.如果我们要进入一个具体的文件夹,那么继续输入命令.比如我要进入pythoncoding这个文件夹,则输入 cd pythoncoding

  2. Skiing 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题(拓扑序求有向图最长路)

    参考博客(感谢博主):http://blog.csdn.net/yo_bc/article/details/77917288 题意: 给定一个有向无环图,求该图的最长路. 思路: 由于是有向无环图,所 ...

  3. qt 在ui界面添加控件后在cpp文件中无法调用?

    问题:qt 在ui界面添加控件后在cpp文件中无法调用? 解决方法:在build选项中选择“重新build项目”,再次在cpp中调用添加的控件发现可以调用了. 还有一种情况导致添加控件后无法调用,就是 ...

  4. Quick BI 3.0 - 强大的多维分析表格:交叉表

    写在开头 对于普通的表格展示数据,相信大家都非常熟悉了,今天给大家介绍的是BI领域的分析利器-交叉表,这个在BI分析场景中使用占比最多的分析利器.通过交叉表对数据的承载和管理,用户可以一目了然地分析出 ...

  5. PHP5.2 汉字json_encode

    //对汉字编码 private function url_encode($str) { if(is_array($str)) { foreach($str as $key=>$value) { ...

  6. js中setInterval与setTimeout用法 实现实时刷新每秒刷新

    setTimeout 定义和用法:  setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式.     语法:  setTimeout(code,millisec)     参数:    ...

  7. oracle函数 sys_guid()

    [功能]生产32位的随机数,不过中间包括一些大写的英文字母. [返回]长度为32位的字符串,包括0-9和大写A-F [示例] select sys_guid() from  dual

  8. uva 11665 Chinese Ink (几何+并查集)

    UVA 11665 随便给12的找了一道我没做过的几何基础题.这题挺简单的,不过uva上通过率挺低,通过人数也不多. 题意是要求给出的若干多边形组成多少个联通块.做的时候要注意这题是不能用double ...

  9. hdu 5744 Keep On Movin (2016多校第二场)

    Keep On Movin Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  10. Project Euler Problem 12-Highly divisible triangular number

    最直接的想法就是暴力搞搞,直接枚举,暴力分解因子.再好一点,就打个素数表来分解因子.假设num=p1^a1p2^a2...pn^an,则所有因子个数为(a1+1)(a2+1)...(an+1). 再好 ...