解决方案 »

  1.   

    答案应该是abcabcabc。
    其实如果你在 public synchronized void printAll(){
            for(int i=0;i<names.size();i++){
                System.out.print(names.get(i)+"");
            }
            //加上一句换行,你就应该明白结果了。
            System.out.println();
        }你的add和printAll方法都是加锁了的。所以你创建两个线程时,
    第一个线程创建,添加a,b,c到List里面,然后调用printAll方法输出整个List里面的内容,
    第二个线程创建后,又添加了a,b,c到List里面,此时List里面是有2个abc即6个元素的。所以第二个线程调用printAll会打印abcabc。
    如果你把你的线程数设置为3个的话,那结果给就是1+2+3=6个abc了。
    加一个换行就能清晰的看到每个线程打印的元素。
      

  2.   

    不好意思,刚刚没有想清楚,答案是不固定的,因为当线程1在运行时,线程2有可能抢夺到系统资源,而进行add操作。
    我上面说到的那种情况,没有考虑多线程下,线程抢夺资源线程切换的问题。
    不好意思。希望各位勿喷。