concurrent (一)concurrent
参考文档:
跳跃表原理分析:https://blog.csdn.net/a1259109679/article/details/46442895
一、阻塞队列
ArrayBlockingQueue :
一个由数组结构组成的有界阻塞队列
可选公平策略(默认不保证公平)(可重入锁实现),必须指定大小,一把锁
LinkedBlockingQueue :
一个由链表结构组成的,双向的,有界阻塞队列
默认大小: Integer.MAX_VALUE,两把锁,头元素一把,尾元素一把
PriorityBlockingQueue :
一个支持优先级排序的无界阻塞队列
默认情况下元素采取自然顺序排列,也可以通过比较器comparator来指定元素的排序规则。元素按照升序排列。
DelayQueue:
一个使用优先级队列实现的无界阻塞队列
DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指 定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。
SynchronousQueue:
一个不存储元素的阻塞队列
SynchronousQueue是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。SynchronousQueue可以看成 是一个传球手,负责把生产者线程处理的数据直接传递给消费者线程。队列本身并不存储任何元素,非常适合于传递性场景,比如在一个线程中使用的数据,传递给另外一个线程使用,SynchronousQueue的吞吐量高于LinkedBlockingQueue 和 ArrayBlockingQueue。
LinkedTransferQueue:
一个由链表结构组成的无界阻塞队列
二、非阻塞队列
concurrentlinkedqueue
基于链表,无大小限制,基于cas的非阻塞队列。不允许null元素
三、CopyOnWrite容器(读写分离)
其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略.写时加锁,读时不加锁。如果读时有其他线程同时在写,则读到的是旧数据,只保证最终数据一致性,不保证实时数据一致性
CopyOnWriteArrayList:
CopyOnWriteArraySet
应用场景:读多写少的并发场景
缺点: 1)内存占用大
2)数据一致性问题。
注意:
1)减少扩容开销。根据实际需要,初始化CopyOnWriteMap的大小,避免写时CopyOnWriteMap扩容的开销。
2) 使用批量添加。因为每次添加,容器每次都会进行复制,所以减少添加次数,可以减少容器的复制次数。如使用上面代码里的addBlackList方法。
四、map
concurrenthashmap
参考文档:http://www.infoq.com/cn/articles/ConcurrentHashMap/
分段锁,segment, hashentry[]
get()不加锁:volatile替换锁 segment的对象talbe 是volatile类型,java内存模型的happen before:写操作优先于读操作
segment再哈希:
1 ) 将key 哈希得到值h1
2)对h1的高位进行再哈希得到值h2,通过h2找到对应的segment.(为了均匀的分配到segment上)
3)将h2再哈希 得到值h3,通过h3找到entry
put()加锁:插入元素前判断是否扩容,针对当前segment进行扩容
size(): 两种策略,
1)先不加锁,两次累加segment size,如果未发生改变 则结束:modCount变量,在put , remove和clean方法里操作元素前都会将变 量modCount进行加1, 那么在统计size前后比较modCount是否发生变化
2)方法1 失败后,加锁累加sementsize
初始化参数:initialCapacity容量(default16),loadFactor加载因子(default0.75),concurrencyLevel(default16
)并发级别 组合可选
segment 与concurrencyLevel的关系:http://blog.csdn.net/hitxueliang/article/details/24734861
ConcurrentSkipListMap
基于跳跃表(一种可以代替平衡树的数据结构)
key有序,支持高并发,且并发越高的情况下性能优势越明显
使用建议:
1)在非多线程的情况下,应当尽量使用TreeMap
2)对于并发性相对较低的并行程序可以使用Collections.synchronizedSortedMap将TreeMap进行包装
3)高并发程序,应当使用ConcurrentSkipListMap,能够提供更高的并发度。
五 信号量 Semaphore
Semaphore
通常用于限制可以访问某些资源(物理或逻辑的)的线程数目
默认为非公平信号量
六 同步辅助类
CountDownLatch
基于共享锁模型
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。
CyclicBarrier
它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
concurrent (一)concurrent的更多相关文章
- jdk8中java.util.concurrent包分析
并发框架分类 1. Executor相关类 Interfaces. Executor is a simple standardized interface for defining custom th ...
- Qt之Concurrent Map和Map-Reduce
简述 QtConcurrent::map().QtConcurrent::mapped()和QtConcurrent::mappedReduced()函数在一个序列中(例如:QList或QVector ...
- Qt之Concurrent框架
简述 QtConcurrent命名空间提供了一个高级API来编写多线程程序,而无需使用低级线程原语,例如:互斥.读写锁.等待条件或信号量.使用QtConcurrent编写的程序使用的线程数量会自动根据 ...
- DBA_Oracle Erp重启Database/Application/Concurrent/Apache(案例)
2014-12-27 Created By BaoXinjian
- Java Concurrency - java.util.concurrent API Class Diagram
摘自: www.uml-diagrams.org Here we provide several UML class diagrams for the Java™ 7 java.util.concur ...
- 《Oracle Applications DBA 基础》- 9 - Concurrent Processing[Z]
<Oracle Applications DBA 基础>- 9 - Concurrent Processing================================== 参考资料 ...
- concurrent.futures
concurrent.futures concurrent.futures提供高层次的接口,用来实现异步调用. 这个异步执行可以使用threads(ThreadPoolExecutor)或者proce ...
- 《Oracle Applications DBA 基础》- 9 - Concurrent Processing
来自:http://www.itpub.net/thread-1411293-1-4.html <Oracle Applications DBA 基础>- 9 - Concurrent P ...
- Haskell语言学习笔记(84)Concurrent
Control.Concurrent Prelude> import Control.Concurrent Prelude Control.Concurrent> Control.Conc ...
- Concurrent.Thread.js
(function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'functi ...
随机推荐
- Web应急:网站被植入Webshell
网站被植入webshell,意味着网站存在可利用的高危漏洞,攻击者通过利用漏洞入侵网站,写入webshell接管网站的控制权.为了得到权限 ,常规的手段如:前后台任意文件上传,远程命令执行,Sql注入 ...
- 【JVM】【linux】linux上执行jmap命令查看JVM内存使用情况,报错:sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypes" in any of the known library name
运行命令: jmap -heap 报错如下: Attaching to process ID , please wait... sun.jvm.hotspot.debugger.NoSuchSymbo ...
- java自带日志框架打印info以下级别日志
本文为CSDN博主「LanTingShuXu」的原创文章,原文链接:https://blog.csdn.net/LanTingShuXu/article/details/80528558 java.u ...
- 我是如何一步步编码完成万仓网ERP系统的(五)产品库设计 1.产品类别
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- Exif认识(二)
通过php获取exif信息后,像光圈和快门的值还需要转换下,才是我们常用看得懂的值 ApertureValue的值: 拍照时镜头的光圈. 单位是 APEX. 为了转换成普通的 F-number(F-s ...
- HighChat 动态绑定数据(二)
也是对最近几天的折线图搞得烦心,看了好多前辈的文章,也总结了一下. 1.先看后台程序,这是我模拟的一些参数 就是一个字符串.没啥好说的 public ActionResult Index2() { s ...
- 响应式开发 纯CSS实现隐藏菜单栏
// 将要隐藏的菜单设置 display: block; // 然后在菜单上面设置一个点击选项,如“菜单”<label for="toggle-checkbox" id=&q ...
- mysql的my.cnf
配置参数详解 [client] #客户端设置,即客户端默认的连接参数port = 3307 #默认连接端口socket = /data/mysqldata/3307/mysql.sock #用于本 ...
- c语言-数组、指针面试题
转载 说明:所有题目均摘录于网络以及我所见过的面试题目,欢迎补充! 无特殊说明情况下,下面所有题s目都是linux下的32位C程序. 先来几个简单的热热身. 1.计算以下sizeof的值. char ...
- 使用gacutil把COM组件注册到全局缓存GAC中
我们在编写软件的时候,有时候需要调用COM组件,那就需要注册了,注册有两种,一种是使用regasm 在程序运行的时候注册,参考“pb调用C#编写的DLL类库“,不过受路径的限制.还有一种注册方式,使用 ...