码迷,mamicode.com
首页 > 其他好文 > 详细

使用无锁的方式和有锁的方式的程序性能对比

时间:2014-10-13 00:03:08      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   使用   ar   java   for   sp   

这里分别使用有锁和无锁两种方式,对一个数值进行增加,一直增加到100000,然后输出使用时间的长短。

 

  1 import java.util.concurrent.ExecutorService;
  2 import java.util.concurrent.Executors;
  3 import java.util.concurrent.TimeUnit;
  4 import java.util.concurrent.atomic.AtomicInteger;
  5 
  6 public class TestAtomic {
  7 
  8     // 设置线程数量
  9     private static int N = 1000;
 10     // 设置最大值
 11     private static int M = 1000000;
 12 
 13     /**
 14      * 无锁方法
 15      * 
 16      * @throws InterruptedException
 17      */
 18     private static void atomicMethod() throws InterruptedException {
 19         AtomicRun atomicRun = new AtomicRun();
 20         AtomicRun.endValue = M;
 21 
 22         ExecutorService service = Executors.newFixedThreadPool(N);
 23         // 开始时间
 24         long starttime = System.currentTimeMillis();
 25         for (int i = 0; i < N; i++) {
 26             service.submit(atomicRun);
 27         }
 28         service.shutdown();
 29         service.awaitTermination(Integer.MAX_VALUE, TimeUnit.MILLISECONDS);
 30         // 结束时间
 31         long endTime = System.currentTimeMillis();
 32         System.out.println("无锁线程数量为 : " + N + " 开始时间为 : " + starttime
 33                 + " 结束时间为 : " + endTime + " 耗费时间为 : " + (endTime - starttime)
 34                 + "ms" + " value:" + AtomicRun.atomicInteger);
 35     }
 36 
 37     /**
 38      * 加锁方法
 39      * 
 40      * @throws InterruptedException
 41      */
 42     private static void synMethod() throws InterruptedException {
 43         SynRun synRun = new SynRun();
 44         SynRun.endValue = M;
 45 
 46         ExecutorService service = Executors.newFixedThreadPool(N);
 47         long starttime = System.currentTimeMillis();
 48         for (int i = 0; i < N; i++) {
 49             service.submit(synRun);
 50         }
 51         service.shutdown();
 52         service.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
 53         long endTime = System.currentTimeMillis();
 54         System.out.println("有锁线程数量为 : " + N + " 开始时间为 : " + starttime
 55                 + " 结束时间为 : " + endTime + " 耗费时间为 : " + (endTime - starttime)
 56                 + "ms" + " value:" + AtomicRun.atomicInteger);
 57     }
 58 
 59     public static void main(String[] args) throws InterruptedException {
 60         System.out.println("当线程数量为 : " + N + "时:");
 61         atomicMethod();
 62         synMethod();
 63     }
 64 }
 65 
 66 /**
 67  * 
 68  * @author 秦孔祥
 69  * 
 70  */
 71 class AtomicRun implements Runnable {
 72 
 73     protected static AtomicInteger atomicInteger = new AtomicInteger();
 74     protected static int endValue;
 75 
 76     @Override
 77     public void run() {
 78         int startValue = atomicInteger.get();
 79         while (startValue < endValue) {
 80             startValue = atomicInteger.incrementAndGet();
 81         }
 82     }
 83 }
 84 
 85 class SynRun implements Runnable {
 86 
 87     protected static int startValue;
 88     protected static int endValue;
 89 
 90     @Override
 91     public void run() {
 92         while (startValue < endValue) {
 93             addValue();
 94         }
 95     }
 96 
 97     private synchronized void addValue() {
 98         startValue++;
 99     }
100 }

 

使用无锁的方式和有锁的方式的程序性能对比

标签:style   blog   color   io   使用   ar   java   for   sp   

原文地址:http://www.cnblogs.com/Cilimer/p/4021210.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!