一直在书看到用Collections.synchronizedList可以起线程安全的作用,但是没有找到反例说明不用这个就会出现错误结果的例子有谁可以给个例子用运行结果来说明不用Collections.synchronizedList就不行? 在线等

解决方案 »

  1.   

    当多个线程用到collection接口类的时候,如果其中一个线程遍历了在修改了
    其中的值,例外一个线程在同一个时间访问的话就会出现同步问题
      

  2.   

    Map 和 Set的例子也行,我只是想弄清楚到底怎样的代码会让Collections.synchronizedXXX表现出作用来
      

  3.   

    之前看到的一个例子,给出了ArrayList和Vector的区别,多次运行后ArrayList会出现空值
    如果把static ArrayList al = new ArrayList(20);换成static List al = Collections.synchronizedList(new ArrayList(20));应该就没有这个问题了,你可以试试看。
    当然,这个例子比较简单,只有添加操作,如果还需要访问的话,按照JDK的记载,还需要在使用到变量的时候加上Synchronized(...),你可以去查下Collections.synchronizedList的用法import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Collections;
    import java.util.List;
    import java.util.Vector;public class synchronizedCollectionTest {    static ArrayList al = new ArrayList(20);
        static Vector vt = new Vector();    public static void main(String[] args) throws Exception {        Thread thread1 = new Thread() {            public void run() {
                    for (int i = 0; i < 10; i++) {
                        al.add(al.size(),new Integer(i));
                        vt.add(vt.size(),new Integer(i));
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };        Thread thread2 = new Thread() {            public void run() {
                    for (int i = 0; i < 10; i++) {
                        al.add(al.size(),new Integer(i));
                        vt.add(vt.size(),new Integer(i));
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };        thread1.start();        thread2.start();        thread1.join();
            thread2.join();
            System.out.println(al);
            System.out.println(vt);
        }}