`

实战Concurrent(3)

阅读更多

来自http://www.iteye.com/topic/363625

 

3、并发集合类

集合类是大家编程时经常要使用的东西,ArrayList、HashMap什么的,java.util包中的集合类有的是线程安全的,有的则不是,在编写多线程的程序时使用线程安全的类能省去很多麻烦,但这些类的性能如何呢?java.util.concurrent包中提供了几个并发结合类,例如ConcurrentHashMap、ConcurrentLinkedQueue和CopyOnWriteArrayList等等,根据不同的使用场景,开发者可以用它们替换java.util包中的相应集合类。

 

CopyOnWriteArrayList是ArrayList的一个变体,比较适合用在读取比较频繁、修改较少的情况下,因为每次修改都要复制整个底层数组。ConcurrentHashMap中为Map接口增加了一些方法(例如putIfAbsenct()),同时做了些优化,总之灰常之好用,下面的代码中使用ConcurrentHashMap来作为全局节点表,完全无需考虑并发问题。ValidationService中只是声明(第17行),具体的使用是在上面的ValidationTask中。

Java代码 
  1. package  service;  
  2.   
  3. import  java.util.ArrayList;  
  4. import  java.util.List;  
  5. import  java.util.Map;  
  6. import  java.util.concurrent.ConcurrentHashMap;  
  7.   
  8. /**  
  9.  * 执行验证的服务类  
  10.  *   
  11.  * @author DigitalSonic  
  12.  */   
  13. public   class  ValidationService {  
  14.     /**  
  15.      * 全局节点表  
  16.      */   
  17.     public   static   final  Map<String, Node> NODE_MAP =  new  ConcurrentHashMap<String, Node>();  
  18.   
  19.     private  ThreadPoolService threadPoolService;  
  20.       
  21.     public  ValidationService(ThreadPoolService threadPoolService) {  
  22.         this .threadPoolService = threadPoolService;  
  23.     }  
  24.   
  25.     /**  
  26.      * 给出一个入口节点的WSDL,通过广度遍历的方式验证与其相关的各个节点  
  27.      *   
  28.      * @param wsdl 入口节点WSDL  
  29.      */   
  30.     public   void  validate(List<String> wsdl) {  
  31.         List<String> visitedNodes = new  ArrayList<String>();  
  32.         List<String> nextRoundNodes = new  ArrayList<String>();  
  33.   
  34.         nextRoundNodes.addAll(wsdl);  
  35.         while  (nextRoundNodes.size() >  0 ) {  
  36.             List<ValidationTask> tasks = getTasks(nextRoundNodes);  
  37.             List<Node> nodes = threadPoolService.invokeAll(tasks);  
  38.   
  39.             visitedNodes.addAll(nextRoundNodes);  
  40.             nextRoundNodes.clear();  
  41.             getNextRoundNodes(nodes, visitedNodes, nextRoundNodes);  
  42.         }  
  43.     }  
  44.   
  45.     private  List<String> getNextRoundNodes(List<Node> nodes,  
  46.             List<String> visitedNodes, List<String> nextRoundNodes) {  
  47.         for  (Node node : nodes) {  
  48.             for  (String wsdl : node.getDependencies()) {  
  49.                 if  (!visitedNodes.contains(wsdl)) {  
  50.                     nextRoundNodes.add(wsdl);  
  51.                 }  
  52.             }  
  53.         }  
  54.         return  nextRoundNodes;  
  55.     }  
  56.   
  57.     private  List<ValidationTask> getTasks(List<String> nodes) {  
  58.         List<ValidationTask> tasks = new  ArrayList<ValidationTask>(nodes.size());  
  59.         for  (String wsdl : nodes) {  
  60.             tasks.add(new  ValidationTask(wsdl));  
  61.         }  
  62.         return  tasks;  
  63.     }  

分享到:
评论

相关推荐

    实战Concurrent

    "实战Concurrent"这一主题主要聚焦于Java中的并发编程,它涉及到多线程、并发容器、同步机制以及性能优化等多个方面。通过深入理解并实践这些概念,开发者可以更好地设计和实现能够充分利用现代多核处理器能力的应用...

    实战Concurrent-BlockQueue

    《实战Concurrent-BlockQueue》 在Java并发编程领域,`Concurrent-BlockQueue`是一个重要的数据结构,它结合了线程安全与高效性能。本文将深入探讨`ConcurrentLinkedQueue`、`ArrayBlockingQueue`以及`...

    Doug Lea, Concurrent Programming in Java Design Principles and Patterns

    3. **并发设计模式**:书中详细阐述了一系列并发设计模式,如生产者-消费者模型、读写锁、工作窃取算法等,这些模式有助于编写高效且可扩展的并发程序。 4. **Java并发工具**:Doug Lea详细介绍了java.util....

    使用Java并发编程Concurrent Programming Using Java

    Java平台提供了丰富的API支持并发编程,如`java.util.concurrent`包下的各种类和接口,这些工具可以帮助开发者更高效地管理多线程环境下的任务调度和数据共享问题。 ### Java并发编程基础 #### 1. 多线程基础 - **...

    concurrent-programming:《实战java高并发程序设计》源码整理

    《实战java高并发程序设计》源码整理联系作者十三的java的学习交流QQ群: 881582471 , 658365129(已满)相关文章书籍封面目录第1章走入并行世界1.1何去何从的并行计算1.1.1忘掉那该死的并行1.1.2可怕的现实:摩尔...

    java并发编程实战源码-concurrent-programming:《Java并发编程实战》源码整理

    《Java并发编程实战》这本书是Java并发编程领域的一本经典之作,它深入浅出地讲解了如何在Java环境中高效、安全地进行多线程编程。源码整理集合`concurrent-programming-master`提供了书中示例代码,对于学习和理解...

    Java 并发编程实战.pdf

    此外,该书可能会对Java中一些新的并发API进行探讨,如java.util.concurrent包下的工具类和接口,例如Executor框架、Future、CompletableFuture、ConcurrentHashMap、Semaphore等。这些工具类和接口在构建大规模并发...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    3. **并发容器**:书中详细讨论了`java.util.concurrent`包下的并发容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`和`BlockingQueue`等。这些容器设计为线程安全,可以提高多线程环境下的性能。 4. **并发...

    《java 并发编程实战高清PDF版》

    《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...

    Java并发编程:设计原则与模式(Concurrent.Programming.in.Java)(中英版)

    这本书不仅提供了丰富的理论知识,还介绍了实战中的设计原则和模式,对于Java开发者来说是不可或缺的参考资源。 在Java并发编程领域,理解设计原则至关重要,因为它们指导我们编写高效、安全且可维护的多线程代码。...

    java concurrent in practive

    《Java并发编程实战》还会讨论`java.util.concurrent`包中的高级并发工具,如`ExecutorService`和`Future`,它们可以方便地管理和控制线程池,提高系统的并行处理能力。`CountDownLatch`、`CyclicBarrier`和`...

    Concurrent Programming on Windows

    五、实战技巧与理论知识的完美结合 Steve Teixeira,微软Parallel Computing Platform部门的产品单元经理,对本书给予了高度评价。他认为本书既全面覆盖了Windows平台上的并发编程,又实用地介绍了可以直接应用于...

    python爬虫项目实战

    6. **多线程与异步IO**:通过`concurrent.futures`或者`asyncio`库实现多线程或异步爬取,提升爬虫效率。 7. **Scrapy框架应用**:当项目规模扩大时,使用Scrapy框架可以更好地组织代码,处理复杂的爬虫逻辑,如...

    实战Java高并发程序设计(高清版)

    4. **并发工具类**:Java并发包(java.util.concurrent)中包含了很多实用的工具类,如`Future`、`CompletableFuture`、`Semaphore`等,这些工具可以帮助开发者更好地管理并发任务。 5. **J.U.C框架**:Java并发 ...

    Java并发编程实战

    5.1.2 迭代器与Concurrent-ModificationException 5.1.3 隐藏迭代器 5.2 并发容器 5.2.1 ConcurrentHashMap 5.2.2 额外的原子Map操作 5.2.3 CopyOnWriteArrayList 5.3 阻塞队列和生产者-消费者模式 5.3.1 ...

    java并发编程实战高清版pdf

    3. **锁**:Java中的锁机制包括内置锁(监视器锁)和显式锁。内置锁通过`synchronized`实现,而显式锁如`Lock`接口及其实现(如`ReentrantLock`)提供了更高级的功能,如可中断、公平性和尝试获取锁。 4. **并发...

    c#多线程编程实战(原书第二版)源码

    《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...

    jvm调优实战经验

    - **CMS(Concurrent Mark Sweep)GC**:并发标记清除,尽可能减少STW(Stop-The-World)时间,适合响应时间敏感的应用。 - **G1(Garbage-First)GC**:新一代的垃圾回收器,目标是整体暂停时间可预测,适合...

Global site tag (gtag.js) - Google Analytics