ArrayList,LinkedList,ArrayBlockingQueue,LinkedBlockingQueue的比较,
ArrayList,LinkedList,ArrayBlockingQueue,LinkedBlockingQueue的比较,
经人提醒,还有个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();
}
}
}
相关文章
- 暂无相关文章
用户点评