public class TestSync implements Runnable {
   Timer t = new Timer();
public static void main(String[] args) {
  TestSync ts = new TestSync();
  Thread t1 = new Thread(ts);
  Thread t2 = new Thread(ts);
  t1.setName("t1");
  t2.setName("t2");
  t1.start();
  t2.start();
}
  public void run(){
  t.add(Thread.currentThread().getName());
  }
}
class Timer{
private static int n = 0 ;
public synchronized void add(String name){
 n ++ ;
 try{
 Thread.sleep(10);
 }catch(InterruptedException e){}
System.out.println(name+"你好,你是第"+n+"个线程!");
}

}
理想结果:t1是第一个线程
          t2是第二个线程。
 但显示出来居然是::
           t2是第一个线程
           t1是第二个线程。
  难到synchronized没有把add方法锁定?

解决方案 »

  1.   

    start()方法只是提醒jvm,可以调用run()方法了,而不是马上就调用
      

  2.   

    你把sleep去掉,多跑几次,就发现打印出来的语句是随机的
    你不能控制哪个线程先跑哪个后跑
      

  3.   

    在doc下编译没问题,在eclipse,上就不一样了啊。
      

  4.   

    这个问题,不在于add方法那.............
    .............
    t1.setName("t1");
    t2.setName("t2");执行到这时,线程的名字是t2,再往下走
    t1.start();
    t2.start();
    这里不是t1写在上面就一定先执行,cpu有可能是在要执先t1线程时停止,而转去执行t2线程。这就是多线程的意义。
      

  5.   

    嗯,这个里面是可以通过改变线程的优先级来达到效果的t1.setPriority(9);
    t2.setPriority(1);