实验--线程安全(1)ArrayList

来源:互联网 发布:知乎dota2 编辑:程序博客网 时间:2024/05/29 07:48

事实不像想象中的那样,实践,体会的才深。

 

被覆盖输出

list.size()=1937  //73个元素被覆盖// 如果size==2000,再试一次直到size <2000

p=1508,n=1510  //1509被覆盖

p=1575,n=1577  //1509被覆盖

检查全部输出:

1506-3001-1507-1508-3002-1510,发现1509被覆盖了。

 

LinkList,不仅会少,还会nullPointer,因为本身它的last.next==null,多线程,会让被覆盖的元素.next==null,next.next时就会nullPointer了。

import java.util.ArrayList;import java.util.List;/** * @author timeriver.wang * @date 2014-04-18 8:59:08 AM */public class Test {    public static void main( String[] args ) {        new Test().work();    }        public void work(){        List<Integer> list = new ArrayList<Integer>(2000);        TT tt = new TT(list);        Thread t1 = new Thread( tt, "t-1" );        Thread t2 = new Thread( tt, "t-2" );        t1.start();        t2.start();        //尽量保证两个线程的方法体同时开始执行        tt.started =true;        //确保线程t-1,t-2运行结束        try {            Thread.sleep( 10000 );        }        catch ( InterruptedException e ) {        }        printSeq( list );        printAll( list );    }        private class TT implements Runnable{        private List<Integer> list;        public volatile boolean started;        public TT(List<Integer> list){            this.list = list;        }        @Override        public void run() {            while(true){                if(started){                    if(Thread.currentThread().getName().contains( "-1" )){                        System.out.println(Thread.currentThread().getName()+list.size());                        for(int i=1000;i<2000;i++){                            list.add( i );                        }                    }else{                        System.out.println(Thread.currentThread().getName()+list.size());                        for(int i=3000;i<4000;i++){                            list.add( i );                        }                    }                    break;                }            }        }    }        private void printAll(List<Integer> list){        System.out.println("############################");        System.out.println("输出全部");        System.out.println("############################");        System.out.println("list.size()="+list.size());        for(int i=0;i<list.size();i++){            System.out.print(list.get( i )+"-");            if(i%100 == 0){                System.out.println();            }        }    }        private void printSeq(List<Integer> list){        System.out.println("############################");        System.out.println("顺序被覆盖的元素输出");        System.out.println("############################");        System.out.println("list.size()="+list.size());        int p = 999;        int n = 0;        for(int i=0;i<list.size();i++){            n = list.get(i );            if(n == p+1){                p = n;            }else if((n > p+1) && n < p + 1000){                System.out.println("p="+p+",n="+n);                p=n;            }        }    }}

 

原创粉丝点击