`

实战Concurrent(4)

阅读更多

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

 

4、AtomicInteger

对变量的读写操作都是原子操作(除了long或者double的变量),但像数值类型的++ --操作不是原子操作,像i++中包含了获得i的原始值、加1、写回i、返回原始值,在进行类似i++这样的操作时如果不进行同步问题就大了。好在java.util.concurrent.atomic为我们提供了很多工具类,可以以原子方式更新变量。

 

以AtomicInteger为例,提供了代替++ --的getAndIncrement()、incrementAndGet()、getAndDecrement()和decrementAndGet()方法,还有加减给定值的方法、当前值等于预期值时更新的compareAndSet()方法。

 

下面的例子中用AtomicInteger保存全局验证次数(第69行做了自增的操作),因为validateNode()方法会同时被多个线程调用,所以直接用int不同步是不行的,但用AtomicInteger在这种场合下就很合适。

Java代码 
  1. package  service.mock;  
  2.   
  3. import  java.util.ArrayList;  
  4. import  java.util.HashMap;  
  5. import  java.util.List;  
  6. import  java.util.Map;  
  7. import  java.util.concurrent.atomic.AtomicInteger;  
  8. import  java.util.logging.Logger;  
  9.   
  10. import  service.Node;  
  11.   
  12. /**  
  13.  * 模拟执行节点验证的Mock类  
  14.  *   
  15.  * @author DigitalSonic  
  16.  */   
  17. public   class  MockNodeValidator {  
  18.     public   static   final  List<Node>         ENTRIES  =  new  ArrayList<Node>();  
  19.     private   static   final  Map<String, Node> NODE_MAP =  new  HashMap<String, Node>();  
  20.   
  21.     private   static  AtomicInteger           count    =  new  AtomicInteger( 0 );  
  22.     private   static  Logger                  logger   = Logger.getLogger( "MockNodeValidator" );  
  23.   
  24.     /*  
  25.      * 构造模拟数据  
  26.      */   
  27.     static  {  
  28.         Node node0 = new  Node( "NODE0" "http://node0/check?wsdl" ); //入口 0   
  29.         Node node1 = new  Node( "NODE1" "http://node1/check?wsdl" );  
  30.         Node node2 = new  Node( "NODE2" "http://node2/check?wsdl" );  
  31.         Node node3 = new  Node( "NODE3" "http://node3/check?wsdl" );  
  32.         Node node4 = new  Node( "NODE4" "http://node4/check?wsdl" );  
  33.         Node node5 = new  Node( "NODE5" "http://node5/check?wsdl" );  
  34.         Node node6 = new  Node( "NODE6" "http://node6/check?wsdl" ); //入口 1   
  35.         Node node7 = new  Node( "NODE7" "http://node7/check?wsdl" );  
  36.         Node node8 = new  Node( "NODE8" "http://node8/check?wsdl" );  
  37.         Node node9 = new  Node( "NODE9" "http://node9/check?wsdl" );  
  38.   
  39.         node0.setDependencies(new  String[] { node1.getWsdl(), node2.getWsdl() });  
  40.         node1.setDependencies(new  String[] { node3.getWsdl(), node4.getWsdl() });  
  41.         node2.setDependencies(new  String[] { node5.getWsdl() });  
  42.         node6.setDependencies(new  String[] { node7.getWsdl(), node8.getWsdl() });  
  43.         node7.setDependencies(new  String[] { node5.getWsdl(), node9.getWsdl() });  
  44.         node8.setDependencies(new  String[] { node3.getWsdl(), node4.getWsdl() });  
  45.   
  46.         node2.setResult("FAILED" );  
  47.   
  48.         NODE_MAP.put(node0.getWsdl(), node0);  
  49.         NODE_MAP.put(node1.getWsdl(), node1);  
  50.         NODE_MAP.put(node2.getWsdl(), node2);  
  51.         NODE_MAP.put(node3.getWsdl(), node3);  
  52.         NODE_MAP.put(node4.getWsdl(), node4);  
  53.         NODE_MAP.put(node5.getWsdl(), node5);  
  54.         NODE_MAP.put(node6.getWsdl(), node6);  
  55.         NODE_MAP.put(node7.getWsdl(), node7);  
  56.         NODE_MAP.put(node8.getWsdl(), node8);  
  57.         NODE_MAP.put(node9.getWsdl(), node9);  
  58.   
  59.         ENTRIES.add(node0);  
  60.         ENTRIES.add(node6);  
  61.     }  
  62.   
  63.     /**  
  64.      * 模拟执行远程验证返回节点,每次调用等待500ms  
  65.      */   
  66.     public   static  Node validateNode(String wsdl) {  
  67.         Node node = cloneNode(NODE_MAP.get(wsdl));  
  68.         logger.info("验证节点"  + node.getName() +  "["  + node.getWsdl() +  "]" );  
  69.         count.getAndIncrement();  
  70.         try  {  
  71.             Thread.sleep(500 );  
  72.         } catch  (InterruptedException e) {  
  73.             e.printStackTrace();  
  74.         }  
  75.         return  node;  
  76.     }  
  77.   
  78.     /**  
  79.      * 获得计数器的值  
  80.      */   
  81.     public   static   int  getCount() {  
  82.         return  count.intValue();  
  83.     }  
  84.   
  85.     /**  
  86.      * 克隆一个新的Node对象(未执行深度克隆)  
  87.      */   
  88.     public   static  Node cloneNode(Node originalNode) {  
  89.         Node newNode = new  Node();  
  90.   
  91.         newNode.setName(originalNode.getName());  
  92.         newNode.setWsdl(originalNode.getWsdl());  
  93.         newNode.setResult(originalNode.getResult());  
  94.         newNode.setDependencies(originalNode.getDependencies());  
  95.   
  96.         return  newNode;  
  97.     }  
  98. }  

 

上述代码还有另一个功能,就是构造测试用的节点数据,一共10个节点,有2个入口点,通过这两个点能够遍历整个系统。每次调用会模拟远程访问,等待500ms。环境间节点依赖如下:

环境依赖
Node0 [Node1, Node2]
Node1 [Node3, Node4]
Node2 [Node5]
Node6 [Node7, Node8]
Node7 [Node5, Node9]
Node8 [Node3, Node4]

 

分享到:
评论

相关推荐

    实战Concurrent

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

    实战Concurrent-BlockQueue

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

    Doug Lea, Concurrent Programming in Java Design Principles and Patterns

    4. **Java并发工具**:Doug Lea详细介绍了java.util.concurrent包中的各种工具类,如Executor框架、Semaphore信号量、CountDownLatch倒计时器、CyclicBarrier回环栅栏和Future异步计算接口。这些工具极大地简化了...

    使用Java并发编程Concurrent Programming Using Java

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

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

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

    Java 并发编程实战.pdf

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

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

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

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

    4. **并发工具类**:`java.util.concurrent`包还包含一系列并发工具类,如`ExecutorService`、`Future`、`Callable`等,它们简化了任务的提交、管理和结果获取,使并发编程更加灵活和高效。 5. **原子变量**:Java...

    《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

    4. **并发容器**:Java并发库提供了一系列优化过的并发容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`和`BlockingQueue`等,它们在并发环境下有更好的性能表现。 5. **原子变量**:`java.util.concurrent....

    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