import java.util.ArrayList;
import java.util.List;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 s1 = new NameList();
      for(int i=0;i<2;i++){
         new Thread(){
            public void run(){
               s1.add("A");
               s1.add("B");
               s1.add("C");
               s1.printAll();
            }
         }.start();
      }
   }
}
可能输出为:A B C A A B C A B C 

解决方案 »

  1.   

    A B C A 第一次打印
     A B C A B C 第二次打印
      

  2.   

    开了两个线程,分别向ArrayList中添加数据并显示,结果不可预测。
      

  3.   

    我略微修改了你的代码,如下
       public synchronized void printAll(){
          for(int i=0;i<names.size(); i++){
             System.out.print(names.get(i) + " ");
          }
          System.out.println();
       }多次运行后发现的规律是:最后一行中的ABC的个数不少,次序规律是A先出现的个数不会超过B出现的个数,B也不会超出C的个数。
    说明了add方法之间确实是同步的(所以最后一行ABC不缺)
    printAll方法之间也是同步的
    但add和printAll之间并不同步你不换行,就只有猜了。那个结果应该是像2楼推断的那样得到的。