快速业务通道

使用Java构造高可扩展应用 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
线程以保持处理器忙 碌的同时,还可以防止过多的线程相互竞争资源,导致应用程序在线程管理上耗 费过多的资源。

Executor 默认提供了一些有用的预设线程池,可以通过调用 Executors 的 静态工厂方法来创建。

newFixedThreadPool:提供一个具有最大线程个数限制的线程池。

newCachedThreadPool:提供一个没有最大线程个数限制的线程池。

newSingleThreadExecutor:提供一个单线程的线程池。保证任务按照任务队 列说规定的顺序(FIFO,LIFO,优先级)执行。

newScheduledThreadPool:提供一个具有最大线程个数限制线程池,并支持 定时以及周期性的任务执行。

使用Java构造高可扩展应用(4)

时间:2011-06-16 IBM / 戴 晓君 甘 志 齐 尧 罗 志达

使用并发数据结构

Collection 框架曾为 Java 程序员带来了很多方便,但在多核时代, Collection 框架变得有些不大适应。多线程之间的共享数据总是存放在数据结 构之中,如 Map、Stack、Queue、List、Set 等。 Collection 框架中的这些数 据结构在默认情况下并不是多线程安全的,也就是说这些数据结构并不能安全地 被多个线程同时访问。 JDK 通过提供 SynchronizedCollection 为这些类提供 一层线程安全的接口,它是用 synchronized 关键字实现的,相当于为整个数据 结构加上一把全局锁保证线程安全。

java.util.concurrent 中提供了更加高效 collection,如 ConcurrentHashMap/Set, ConcurrentLinkedQueue, ConcurrentSkipListMap/Set, CopyOnWriteArrayList/Set 。这些数据结构是为 多线程并发访问而设计的,使用了细粒度的锁和新的 Lock-free 算法。除了在 多线程条件下具有更高的性能,还提供了如 put-if-absent 这样适合并发应用 的原子函数。

其他一些需要考虑的因素

不要给内存系统太大的压力

如果线程执行过程中需要分配内存,这在 Java 中通常不会造成问题。现代 的 JVM 是高度优化的,它通常为每个线程保留一块 Buffer,这样在分配内存时 ,只要 buffer 没有用光,那么就不需要和全局的堆打交道。而本地 buffer 分 配完毕之后 , JVM 将不得不到全局堆中分配内存,这样通常会带来严重的可扩 展性的降低。另外,给 GC 带来的压力也会进一步降低程序的可扩展性。尽管我 们有并行的 GC,但其可扩展性通常并不理想。如果一个循环执行的程序在每次 执行中都需要分配临时对象,那么我们可以考虑利用 ThreadLocal 和 SoftReference 这样的技术来减少内存的分配。

使用 ThreadLocal

ThreadLocal 类能够被用来保存线程私有的状态信息,对于某些应用非常方 便。通常来讲,它对可扩展性有正面的影响。它能为各个线程提供一个线程私有 的变量,因而多个线程之间无须同步。需要注意的是在 JDK 1.6 之前, ThreadLocal 有着相当低效的实现,如果需要在 JDK 1.5 或更老的版本上使用 ThreadLocal,需要慎重评估其对性能的影响。类似的,目前 JDK 6 中的 ReentrantReadWriteLock 的实现也相当低效,如果想利用读锁之间不互斥的特 性来提高可扩展性,同样需要进行 profile 来确认其适用程度。

锁的粒度很重要

粗粒度的全局锁在保证线程安全的同时,也会损害应用的性能。仔细考虑锁 的粒度在构建高可扩展 Java 应用时非常重要。当 CPU 个数和线程数较少时, 全局锁并不会引起激烈的竞争,因此获得一个锁的代价很小(JVM 对这种情况进 行了优化)。随着 CPU 个数和线程数增多,对全局锁的竞争越来越激烈。除了 一个获得锁的 CPU 可以继续工作外,其他试图获得该锁的 CPU 都只能闲置等待 ,导致整个系统的 CPU 利用率过低,系统性能不能得到充分利用。当我们遇到 一个竞争激烈的全局锁时,可以尝试将锁划分为多个细粒度锁,每一个细粒度锁 保护一部分共享资源。通过减小锁的粒度,可以

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号