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();
}
}
}
- ArrayList,LinkedList,ArrayBlockingQueue,LinkedBlockingQueue的比较
- ArrayBlockingQueue和LinkedBlockingQueue比较
- LinkedBlockingQueue与ArrayBlockingQueue性能比较
- ArrayBlockingQueue跟LinkedBlockingQueue的区别
- ArrayBlockingQueue和LinkedBlockingQueue的区别
- ArrayBlockingQueue和LinkedBlockingQueue的使用
- ArrayBlockingQueue和LinkedBlockingQueue的使用
- ArrayBlockingQueue和LinkedBlockingQueue的区别
- ArrayBlockingQueue跟LinkedBlockingQueue的区别
- ArrayBlockingQueue和LinkedBlockingQueue的使用
- ArrayBlockingQueue和LinkedBlockingQueue的区别
- ArrayBlockingQueue跟LinkedBlockingQueue的区别
- ArrayBlockingQueue和LinkedBlockingQueue的区别
- Vector ArrayList LinkedList 的比较
- LinkedList ArrayList Vector的比较
- ArrayList和LinkedList的比较
- ArrayList、LinkedList、Vector的比较
- linkedList和ArrayList的比较
- C 语言经典题目系列解决方案(8)-选择排序
- linq asp.net 3.x 时代
- Dll学习(二)--隐式链接(例子 from 核心编程)
- http://www.iwms.net/n770c13p3.aspx
- 新三国启示录
- ArrayList,LinkedList,ArrayBlockingQueue,LinkedBlockingQueue的比较
- 端口与服务
- Java保留小数问题
- 使用微软ajax控件出现Message: 'Sys' is undefined的解决方法
- code complete2
- snv更新错误
- Javascript加密解密终级指南escape解密/eval加密/Encode加密原理
- hdoj 3631 Shortest Path
- 数据库为只读的解决方法