import java.util.List;
import java.util.Vector;public class synchronizedDemo {
public static void main(String[] args) {
Resource rs = new Resource();
myThread mythA = new myThread(rs);
mythA.start();
System.out.println(rs.list);
}
}class Resource {
List<Integer> list = new Vector<Integer>();
}class myThread extends Thread {
Resource rs; public myThread(Resource rs) {
this.rs = rs;
}  public void add(){
 for (int i = 0; i < 20; i++) {
rs.list.add(i);
System.out.println("aaaaaaaaaaaaa");
}
 }
public void run() {
add();
}
}
打印结果为:[]
mport java.util.ArrayList;
import java.util.List;public class A {
public static void main(String[] args){
C c = new C();
B b = new B(c);
b.setA();
System.out.println(c.list);
}
}
class B{
C c;
B(C c){
this.c = c;
}
public void setA(){
for(int i =1; i<21;i++){
c.list.add(Integer.valueOf(i));
}
}
}
class C{
List<Integer> list = new ArrayList<Integer>();
}
打印结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

解决方案 »

  1.   

    区别是:
    前者使用了多线程,主线程在执行System.out.println(rs.list);的时候不能保证rs里面有值。
    后者则是正常的执行顺序,当list里面的元素添加完后,主程序才开始打印
      

  2.   

    多线程。
    mythA.start();执行后,线程等系统调用开始执行其run函数
    System.out.println(rs.list);//这条语句在当前线程继续执行
    如果执行时,另外那个线程的run还没执行,那么打印出来就是空的
    如果执行了一半,打印出来可能是有1个或2个或3个....数字
      

  3.   

    也就是说在线程运行时不能保证 数据已经添加进list中
    那我用sleep试试
      

  4.   

    try{
    Thread.sleep(2000);
    }catch(Exception e){
    e.printStackTrace();
    }我加了一段,测试成功了
    另外我想问问大家:
         Vector 该类的功能方法是同步的,同一时刻只能有一个线程访问.能不能写个实例多个线程同时访问Vector。谢谢
      

  5.   

    sleep也不行
    用join才能保证
      

  6.   

    这种问题的话,只需要写程序测试就知道了。得出结果后,再想原因。多看看API
      

  7.   

    也可以这样子
    public static void main(String[] args) {
        Resource rs = new Resource();
        myThread mythA = new myThread(rs);
        mythA.start();
        while(mythA.isAlive()) {
        }
        System.out.println(rs.list);
    }
      

  8.   

    Vector 该类的功能方法是同步的,同一时刻只能有一个线程访问。
    谁帮忙写个实例能体现 《1》同步《2》2个线程访问会报错?
    我是新手就是整了老半天,用一Vector的对象向两个线程传参弄不上