JAVA CONCURRENT FRAMEWORK
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的更多相关文章
- Java Concurrent Topics
To prevent Memory Consistency Errors(MCEs), it is good practice to specify synchronized class specif ...
- java concurrent包的学习(转)
java concurrent包的学习(转) http://my.oschina.net/adwangxiao/blog/110188 我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常 ...
- java collection framework
java collection framework Map
- 将 Java Spring Framework 应用程序迁移到 Windows Azure
我们刚刚发布了一个新教程和示例代码,以阐述如何在Windows Azure中使用 Java 相关技术.在该指南中,我们提供了分步教程,说明如何将 Java Spring Framework 应用程序( ...
- How to Create a Java Concurrent Program
In this Document Goal Solution Overview Steps in writing Java Concurrent Program Template ...
- 【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. ...
- (一)一起学 Java Collections Framework 源码之 概述
. . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述 JDK 中很多类 LZ 已经使用了无数次,但认认真真从源码级研究过其原理的还只占少数,虽然从 ...
- (二)一起学 Java Collections Framework 源码之 AbstractCollection
. . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述(未完成) (二)一起学 Java Collections Framework 源码之 Abs ...
- Java Collection Framework : List
摘要: List 是 Java Collection Framework的重要成员,详细包括List接口及其全部的实现类.由于List接口继承了Collection接口,所以List拥有Collect ...
随机推荐
- spring data jpa 原生sql 别名字段无法注入
开发四年只会写业务代码,分布式高并发都不会还做程序员?->>> 在使用entityManager.createNativeQuery(sql,User.class)这个方法时, ...
- Linux 用户he用户组管理
8)系统中有一类用户称为伪用户(psuedo users). 这些用户在/etc/passwd 文件中也占有一条记录,但是不能登陆,因为他们的登陆shell 为空,他们的存在主要是方便系统管理,满足 ...
- shell爬虫
#!/bin/bash curl_str='curl -x "http://http-pro.abuyun.com:9010" --proxy-basic --proxy-user ...
- JavaScript引用类型和基本类型的区别
JavaScript变量可以用来保存的两种类型的值:基本类型值和引用类型值. 基本类型值有5种类型:undefined,null,boolean,number,string 引用类型值有两种类型:函数 ...
- setTimeout与setInterval有何区别?
①setTimeout和setInterval的语法相同.它们都有两个参数,一个是将要执行的代码字符串,还有一个是以毫秒为单位的时间间隔,当过了那个时间段之后就将执行那段代码. ②不过这两个函数还是有 ...
- call,apply,bind详解
为什么要改变this指向? 我们知道bind,call,apply的作用都是用来改变this指向的,那为什么要改变this指向呢?请看下面的例子: var name="lucy"; ...
- 运行项目npm run dev时报错: ~Error: Cannot find module 'webpack-cli/bin/config-yargs', 原因是
webpack@3.X运行项目npm run dev时报错: ~Error: Cannot find module 'webpack-cli/bin/config-yargs' 我的原因是: web ...
- Python--day67--CBV和FBV、Request对象及上传文件示例
1,CBV版添加新的出版社 views.py文件 urls.py文件 2,Request对象: request对象 当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpReques ...
- X Samara Regional Intercollegiate Programming Contest
A. Streets of Working Lanterns - 2 对于每个括号序列,存在一个\(mv\),表示要接上这个序列至少需要\(-mv\)个左括号,同时处理出接上这个序列后,左括号数量的增 ...
- Python--day26--封装和@property
---恢复内容开始--- @property:修饰过的方法不能传任何参数,把方法伪装成属性,没有这个装饰就像c1.area()这样调用,少了一个括号,没什么用. @name.setter:实现可以修改 ...