import java.util.*;public class NameList {    private List names = new ArrayList();    public synchronized void add(String name) {
        names.add(name);
    }    public synchronized void printAll() {
        for (int i = 0; i < names.size(); i++) {
            System.out.print(names.get(i));
        }
    }    public static void main(String[] args) {
        final NameList sl = new NameList();
        for (int i = 0; i < 2; i++) {
            new Thread() {                @Override
                public void run() {
                    sl.add("A");
                    sl.add("B");
                    sl.add("C");
                    sl.printAll();
                }
            }.start();
        }    }
}为什么有的时候会输入3组ABC,比如ABCABCABC,有的时候4组,比如AABBCCAABBCC呢?
为什么不是2组?谢谢了!

解决方案 »

  1.   

    为什么是2组?for循环执行第一次的时候 names的值ABC  打印ABC
    for循环执行第一次的时候 names的值ABCABC  打印ABCABCAABBCCAABBCC这种情况2个线程交替打印,我觉得没有这种可能
      

  2.   

    3组的情况是第一个线程往names 列表里添加了ABC,此时输出为ABC;接着第二个线程再添加进ABC,此时names 里存的数值为ABCABC,紧接着输出ABCABC,加起来就成ABCABCABC
    而输出AABBCCAABBCC是因为输入数据进names时两个线程交替执行add()方法,第一个输入A接着第二个线程输入A,依次下去,names里的数据为AABBCC,到此时线程1输出AABBCC,接着线程2输出AABBCC,最终就得AABBCCAABBCC
    这里不清楚你说的2组是什么意思?
      

  3.   

    我明白了!谢谢 swandragon!
    谢谢 cangyingzhijia!
      

  4.   

    我设置了一下断点,然后去掉断点让程序继续运行下去.发现有四个ABC,也就是说输出了ABCABCABCABC
      

  5.   

    分析
      第一次,             sl.add("A"); 
                        sl.add("B"); 
                        sl.add("C"); 
                        sl.printAll();
     打印  ABC 并且放到 List中
     第二次,             sl.add("A"); ABCA
                        sl.add("B"); ABCAB
                        sl.add("C");ABCABC
                         sl.printAll(); 打印 ABCABC
    总打印为  ABCABCABC