ArrayList,LinkedList,ArrayBlockingQueue,LinkedBlockingQueue的比较

来源:互联网 发布:淘宝商品推广网站 编辑:程序博客网 时间:2024/04/29 11:13

经人提醒,还有个LinkedBlockingQueue,有空比下

最近需要做一个容器池,考虑本来准备用ArrayList后来发现在多线程下有些问题,所以测试了下ArrayList、ArrayBlockingQueue的区别,后来干脆又加上LinkedList。以下是一些结论

1.ArrayBlockingQueue是同步的,所以是线性安全。其他两个在不加synchronsized的情况下,多线程的时候会丢数据。

2.LinkedList不支持初始化的时候设定宽度,而ArrayBlockingQueue必须设定宽度而且不能扩容。

3.LinkedList和LinkedList在加synchronsized的情况下,对速度影响不大,但比不过ArrayBlockingQueue。

4.ArrayList在超过一定数量后会出现内存溢出,而ArrayBlockingQueue不会。

5.在不考虑同步的情况下LinkedList最快,当然这跟LinkedList本身链表的机制有关。

以下是测试的代码,但已被我改的烂七八糟了

public class xxx {
static BlockingQueue<String> bq = new ArrayBlockingQueue<String>(10000000);
//static List li = new LinkedList();
static List li = new ArrayList(10000000);
//static List li2 = new ArrayList(1000000);
static List li2 = new ArrayList();
static boolean t1_thread_fin = false;
static boolean t2_thread_fin = false;
static boolean t1_thread_fin2 = false;
static boolean t2_thread_fin2 = false;
static boolean t1_queue_fin = false;
static boolean t2_queue_fin = false;

/**
* @param args
*/
public static void main(String[] args) {
   // TODO Auto-
   //queueTest();
   //threadTest();
   threadTest2();
   //testSpeed();
}

static void testSpeed(){
   long begin = System.nanoTime();
   long begin2 = System.currentTimeMillis();
   for(int i=0;i<1000000;i++){
    li.add(i+"");
   }
   System.out.println((System.nanoTime()-begin)+","+(System.currentTimeMillis()-begin2));
  
   li = new ArrayList(1000000);
   begin2 = System.currentTimeMillis();
   begin = System.nanoTime();
   synchronized(li){
    for(int i=0;i<1000000;i++){
     li.add(i+"");
    }
   }
   System.out.println((System.nanoTime()-begin)+","+(System.currentTimeMillis()-begin2));
  
   li = new ArrayList(1000000);
   begin2 = System.currentTimeMillis();
   begin = System.nanoTime();
  
   for(int i=0;i<1000000;i++){
    synchronized(li){
     li.add(i+"");
    }
   }
   System.out.println((System.nanoTime()-begin)+","+(System.currentTimeMillis()-begin2));
  
  
   begin2 = System.currentTimeMillis();
   begin = System.nanoTime();
   for(int i=0;i<1000000;i++){
    bq.add(i+"");
   }
   System.out.println((System.nanoTime()-begin)+","+(System.currentTimeMillis()-begin2));
  
}

public static void threadTest2(){
   Thread t1 = new Thread(){
    public void run(){
     for(int i=0;i<100000;i++){
      String dd = "t1:"+i;
      synchronized(li){
       li2.add(dd);
      }
     }
     t1_thread_fin2= true;
    }
   };
   Thread t2 = new Thread(){
    public void run(){
     for(int i=0;i<100000;i++){
      String dd = "t2:"+i;
      synchronized(li){
       li2.add(dd);
      }
     }
     t2_thread_fin2= true;
    }
   };
   t1.start();
   t2.start();
   try {
    long begin = System.currentTimeMillis();
    while(t2_thread_fin2==false||t1_thread_fin2==false){
     Thread.sleep(1);
    }
    System.out.println("thread2="+li2.size()+","+(System.currentTimeMillis()-begin));
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
}

public static void threadTest(){
   Thread t1 = new Thread(){
    public void run(){
     for(int i=0;i<1000000;i++){
      String dd = "t1:"+i;
      li.add(dd);
     }
     t1_thread_fin= true;
    }
   };
   Thread t2 = new Thread(){
    public void run(){
     for(int i=0;i<1000000;i++){
      String dd = "t2:"+i;
      li.add(dd);
     }
     t2_thread_fin= true;
    }
   };
   t1.start();
   t2.start();
   try {
    long begin = System.currentTimeMillis();
    while(t2_thread_fin==false||t1_thread_fin==false){
     Thread.sleep(1);
    }
    System.out.println("thread="+li.size()+","+(System.currentTimeMillis()-begin));
   
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
}

public static void queueTest(){
   Thread t1 = new Thread(){
    public void run(){
     for(int i=0;i<1000000;i++){
      String dd = "t1:"+i;
      bq.add(dd);
     }
     t1_queue_fin= true;
    }
   };
   Thread t2 = new Thread(){
    public void run(){
     for(int i=0;i<1000000;i++){
      String dd = "t2:"+i;
      bq.add(dd);
     }
     t2_queue_fin= true;
    }
   };
   t1.start();
   t2.start();
   try {
    long begin = System.currentTimeMillis();
    while(t2_queue_fin==false||t1_queue_fin==false){
     Thread.sleep(1);
    }
    System.out.println("queue="+bq.size()+","+(System.currentTimeMillis()-begin));
   
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
}

}