- 浏览: 94681 次
- 性别:
- 来自: 深圳
文章分类
最新评论
4.1 集合包
ArrayList, LinkedList,Vector,TreeSet,HashMap,TreeMap 等,无需多说
4.2 并发包 (java.util.concurrent)
4.2.1 ConcurrentHashMap
线程安全的 HashMap 实现,主要原理是将集合分成多个段 ( 默认 16 个 ) ,分段加锁,实现高并发。
据作者的测试结果,在线程数较少时,无论元素数量多少, ConcurrentHashMap 带来的性能提升不明显,但在线程数为 50 以上时, ConcurrentHashMap 在增加和删除时性能提升了一倍左右,查找时性能提升了 10 倍左右。
因而,在并发场景, ConcurrentHashMap 较之 HashMap 是更好的选择
4.2.2 CopyOnWriteArrayList
线程安全的 ArrayList, 基于 ReentrantLock 保证增加元素和删除元素动作的互斥,在读操作时无锁。
据作者的测试结果,随着元素数量和线程数量增加, CopyOnWriteArrayList 在增加元素和删除元素时性能下降明显,比 ArrayList 更低。但在查找元素上却比 ArrayList 好很多(大于 10 倍)。
因此,在读多写少的并发场景, CopyOnWriteArrayList 较之 ArrayList 是更好的选择。
4.2.3 CopyOnWriteArraySet
基于 CopyOnWriteArrayList 实现,唯一不同的是每次 add 时调用的是 addIfAbsent 方法,此方法需遍历当前 Object 数组,检查待增加的元素是否已存在,已存在则直接返回。故性能略低于 CopyOnWriteArrayList
4.2.4 ArrayBlockingQueue
一个基于固定大小数组、 ReentrantLock 以及 Condition 实现的可阻塞的先进先出的 Queue.
类似的还有过 LinkedBlockingQueue, 对 put 和 offer 采用一把锁,对 take 和 poll 采用另一把锁,避免了读写时互相竞争锁的现象,因此,在高并发读写操作都多的情况下,性能会较 ArrayBlockingQueue 好很多
4.2.5 AtomicInteger
一个支持原子操作的 Integer 类,在没有 AtomicInteger 前,要实现一个按顺序获取的 ID ,就必须在每次获取时进行加锁操作,以避免出现并发时获取到同样 ID 的现象。借助 AtomicInteger ,则可以更简易地实现,如下:
Private static AtomicInteger counter = new AtomicInteger();
Public static int getNextId() {
Return counter.incrementAndGet();
}
incrementAndGet 方法基于 CPU 的 CAS 原语实现,基于 CAS 的操作可以认为是无阻塞的,因此性能好于同步锁的方式。
对于使用 JDK5 以上的版本时,应尽量使用 atomic 的类,除 AtomicInteger 外,还有 AtomicLong 、 AtomicBoolean 、 AtomicReference 等。
4.2.6 ThreadPoolExecutor
一个高效的、支持并发的线程池,要想用好这个线程池,需要合理配置 corePoolSize, 最大线程数、任务缓冲的队列,以及线程池满时的处理策略。常见的需要有如下两种
1. 高性能
如果希望高性能地执行 Runnable 任务,即当线程池中的线程数尚未达到最大个数,则立刻交给线程执行或在最大线程数量的保护下创建线程来执行,可选的方式为使用 SynchronousQueue 作为任务的队列。
2. 缓冲执行
如果希望 Runnable 任务尽量被 corePoolSize 范围的线程执行掉,可选的方式为使用 ArrayBlockingQueue 或 LinkedBlockQueue 作为任务缓冲的队列。这样,当线程数等于或超过 corePoolSize 后,会先加入缓冲队列中,而不是直接交由线程执行。
4.2.7 Executors
提供一些方便创建 ThreadPoolExecutor 的方式
1. newFixedThreadPool(int)
创建固定大小的线程池 keepAliveTime 为 0 ,即线程启动后就不退出,缓冲队列为 LinkedBlockingQueue, 大小为整型的最大数
2. newSingleThreadExecutor()
创建大小为 1 的固定线程池
3. newCachedThreadPool()
创建 corePoolSize 为 0 最大线程数为整型的最大数,线程 keepAliveTime 为 1 分钟,缓存任务的队列为 SynchronousQueue 的线程池
4. newSheduledThreadPool(ing)
创建 corePoolSize 为传入参数,最大线程数为整型的最大数,线程 keepAliveTime 为 0, 缓存任务的队列为 DelayedWorkQueue 的线程池。在实际业务中,通常会有一些需要定时或延迟执行的任务,更典型的是在异步操作时需要超时回调的场景。
JDK5 之前,用 Timer 实现这个功能,两者区别:
1. Timer 单线程,一旦一个 task 运行缓慢,其它的 task 也会推迟, ScheduledThreadPool 并发
2. Timer 中的 task 抛出 RunntimeException 时,其它 task 也不会执行
3. ScheduledThreadPool 可以执行 callable 的 task
4.2.8 FutureTask
可用于异步获取执行结果或取消执行任务的场景,通过传入 Runnable 或 Callable 的任务给 FutureTask ,直接调用其 run 方法或放入线程池执行,之后可在外部通过 FutureTask 的 get 异步获取执行结果。 FutureTask 可以确保即使调用了多闪 run 方法,它都会只执行一次 Runnable 或 Callable 任务。
4.2.9 Semaphore
用于控制某资源同时被访问的个数的类,例如连接池中控制创建的连接个数。
4.2.10 CountDownLatch
可用于控制多个线程同时开始某动作的类,采用的方式为减计数方式。当计数减至零时,位于 latch.await 后的代码才会被执行。
4.2.11 CyclicBarrier
和 CountDownLatch 不同, CyclicBarrier 是当 await 数量达到设定的数量后,才继续向下执行。
4.2.12 ReentrantLock
一个更为方便的控制并发资源的类,和 synchronized 语法达到的效果是一致的。这两者之间如何取舍呢,借用 Brian Goetz 的话 (http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html) :
答案非常简单
——
在确实需要一些
synchronized
所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。
ReentrantLock
还具有可伸缩性的好处,应当在高度争用的情况下使用它,但是请记住,大多数
synchronized
块几乎从来没有出现过争用,所以可以把高度争用放在一边。我建议用
synchronized
开发,直到确实证明
synchronized
不合适,而不要仅仅是假设如果使用
ReentrantLock
“
性能会更好
”
。请记住,这些是供高级用户使用的高级工具。(而且,真正的高级用户喜欢选择能够找到的最简单工具,直到他们认为简单的工具不适用为止。)。一如既往,首先要把事情做好,然后再考虑是不是有必要做得更快。
4.2.13 Condition
接口,典型实现 ReentrantLock , ReentrantLock 提供了一个 newCondition 方法,以便用户在同一个锁的情况下可以根据不同的情况执行等待或唤醒动作。
ReentrantLock.newCondition().await()
ReentrantLock..newCondition().signal()
4.2.14 RenentrantReadWriteLock
和 ReentrantLock 没有继承关系,它提供了读锁( ReadLock )和写锁( WriteLock ),比 ReentrantLock 的一把锁,读写锁分离对读多写少的情况,提高性能。
当调用读锁的 lock 方法时,没有线程持有写锁,就可获得读锁,意味着只要进行读操作,就没有其它线程进行写操作,读操作时无阻塞的;
当调用写锁的 lock 时,如果此时没有线程持有读锁或写锁,则可继续,意味着要进行写时,如果有其它线程进行读或写,就会被阻塞,
读写锁使用时的升级和降级机制:
同一线程中,持有读锁后,不能直接调用写锁的 lock
同一线程中,持有写锁后,可调用读锁的 lock 方法,之后如果调用写锁的 unlock 方法,那么当前锁将降级为读锁。
记作者的测试: 同时启动 102 个线程, 100 个进行读操作 (HashMap.get) , 2 个进行写操作 (HashMap.put), 较之 ReentrantLock , ReentrantReadWriteLock 性能提升了三倍多。
以上分析了 JDK5 以后版本提供的并发包中一些常用类的实现方法,这些类能够帮助开发者更好地控制高并发下的资源操作,尽可能地避免出现不一致及资源竞争激烈等现象。总的来说,基于 CAS 、拆分锁、 voliate 及 AbstractueuedSynchronier 是这些类的主要实现方法,这些方法都是为了尽量减少高并发时的竞争现象,对于实际编码有一定的参考价值,从而保障程序即使在 高并发时也能保持较高的性能。
发表评论
-
技术文章精华合集(持续更新中)
2016-09-20 19:09 718Kafka深度解析 分库分表系列文章 来自 ... -
<<More Joel on Software>> 如何扮演程序经理的角色
2011-07-03 15:13 797制作伟大软体的秘方之 ... -
<<More Joel on Software>> 利诱管理法
2011-07-03 15:10 959利诱管理法 Joke: A poor J ... -
<<More Joel on Software>> The Joel Test: 软件开发成功 12 法则
2011-07-03 14:42 689作者: 周思博 (Joel Spols ... -
<<More Joel on Software>> 看起来简单, 实际上复杂
2011-07-03 14:41 761作者: 周思博 (Joel Spolsky) 译: Bo Y ... -
<<More Joel on Software>> 膨胀软件与80/20的谣传
2011-07-03 14:38 885作者: 周思博 (Joel Spols ... -
<<More Joel on Software>> 每日构建(daily build)是你的朋友
2011-07-03 14:37 852作者: 周思博 (Joel Spols ... -
<<More Joel on Software>> 五个为什么
2011-07-03 14:20 957五个为什么(译文) ... -
<<More Joel on Software>> 飙高音
2011-07-03 13:54 906飙高音(译文) 作者: 阮一峰 日期: 2009年 ... -
<<More Joel on Software>> 关于战略问题的通信之六
2011-07-03 13:51 770关于战略问题的通信之六(译文) 作者: 阮一峰 日 ... -
<<More Joel on Software>> 易用性是不够的
2011-07-03 13:41 739易用性是不够的(译文) 作者: 阮一峰 日期: 2 ... -
<<More Joel on Software>> 军事化管理法
2011-07-03 13:28 963高科技公司能否采用军事化管理?(译文) 作者: 阮一峰 ... -
<<More Joel on Software>> 寻找优秀的程序员
2011-07-03 13:24 1197=================== 寻找 ... -
读书笔记:《分布式JAVA应用 基础与实践》 第七章 构建可伸缩的系统
2011-05-29 12:09 1106通常将通过升级或增加单机机器的硬件来支撑访问量及数据量增长的方 ... -
读书笔记:《分布式JAVA应用 基础与实践》 第六章 构建高可用的系统
2011-05-28 11:02 1200对于互联网或企业中的大型应用而言,多数要求做到 7*24 ... -
读书笔记:《分布式JAVA应用 基础与实践》 第五章 性能调优(二)
2011-05-22 21:34 10905.2 调优 找出性 ... -
读书笔记:《分布式JAVA应用 基础与实践》 第五章 性能调优(一)
2011-05-22 13:43 11355.1 寻找性能瓶颈 通常性能瓶颈的 ... -
读书笔记:《分布式JAVA应用 基础与实践》 第三章 3.3 JVM线程资源同步及交互机制(二)
2011-05-17 21:52 938接下来网上没有,貌似 ... -
《分布式JAVA应用 基础与实践》 第三章 3.3 JVM线程资源同步及交互机制(一)
2011-05-17 19:09 8903.3 JVM线程资源同步及交互机制 Java程序采用 ... -
《分布式JAVA应用 基础与实践》 第三章 3.2 JVM内存管理(四)
2011-05-17 19:00 9253.2.4 JVM内存状况查看 ...
相关推荐
java jdk 类库详解中文版chm格式
本书章节包括分布式java应用,大型分布式java应用与SOA,深入理解jvm,分布式应用与sun jdk类库,性能调优,构件高可用的系统等,同时也适合面试考察的知识点。
Java分布式应用学习笔记04JDK的并发包的集合总结
Java语言具有功能强大和简单易用两个特征,具有简单性、面向对象、分布式等特点,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。JDK(Java Development Kit)称为Java开发包或Java开发工具...
Java JDK 7学习笔记 PDF
第4章 Hadoop的Backup Node方案 4.1 Backup Node概述 4.1.1 系统架构 4.1.2 使用原则 4.1.3 优缺点 4.2 运行机制分析 4.2.1 启动流程 4.2.2 元数据操作情景分析 4.2.3 日志池(journal spool)机制 4.2.4 故障切换...
学生读书笔记共享-学生读书笔记共享系统-学生读书笔记共享系统源码-学生读书笔记共享管理系统-学生读书笔记共享管理系统java代码-学生读书笔记共享系统设计与实现-基于springboot的学生读书笔记共享系统-基于Web的...
学生读书笔记共享-学生读书笔记共享系统-学生读书笔记共享系统源码-学生读书笔记共享管理系统-学生读书笔记共享管理系统java代码-学生读书笔记共享系统设计与实现-基于springboot的学生读书笔记共享系统-基于Web的...
Java文档-jdk-6u10-docs-java类库6.0-高压缩第一部分
毕业设计: 分布式多媒体共享平台,采用分布式系统构架,保证服务的稳定性 目录 系统项目结构 系统构架 系统采用的技术 系统处理流程 如何部署本系统 系统功能 系统功能截图 系统项目结构 系统整个是一个Maven项目,...
《Java JDK7学习笔记》是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习java时遇到的概念、操作、应用或认证考试等问题及解决方案。《Java JDK7学习笔记》针对java se 7新功能全面改版,无论是章节架构...
《精通Java:JDK、数据库系统开发Web开发》全书共分27章,内容涵盖了Java编程环境概述、基础语法、面向对象软件设计方法、线程、数据集合、网络编程、图形编程、多媒体编程以及Java Web开发。本书每一节的例子都是...
Java:jdk1.8
Java基础入门教程 第4章 继承和多态(共36页).ppt Java基础入门教程 第5章 Java基础类的应用(共42页).ppt Java基础入门教程 第6章 集合框架(共28页).ppt Java基础入门教程 第7章 Java中的异常处理(共26页)....
标准类库:JDK提供了丰富的标准类库,包括Java SE库(标准版)、Java EE库(企业版)和Java ME库(移动版),以支持各种应用程序的开发。 调试工具:JDK提供了调试工具,如Java调试器(jdb)、Java监视器工具...