视频教程上的一段代码:public class TestSync implements Runnable {
  Timer timer = new Timer();
  public static void main(String[] args) {
    TestSync test = new TestSync();
    Thread t1 = new Thread(test);
    Thread t2 = new Thread(test);
    t1.setName("t1"); 
    t2.setName("t2");
    t1.start(); 
    t2.start();
  }
  public void run(){
    timer.add(Thread.currentThread().getName());
  }
}class Timer{
  private static int num = 0;
  public synchronized void add(String name){ 
  
    num ++;
    try { Thread.sleep(1); } 
    catch (InterruptedException e) {}
    System.out.println(name+", 你是第"+num+"个使用timer的线程");
  
  }
}教程里的结果是:
t1, 你是第2个使用timer的线程
t2, 你是第2个使用timer的线程
自己实践的结果是:
t1, 你是第1个使用timer的线程
t2, 你是第2个使用timer的线程     教程是2年多前录的了,会不会是CPU的原因呢  有请高手指点下

解决方案 »

  1.   

    视频错了吧
    怎么看怎么都会是顺序进入add方法的
      

  2.   

     第一个线程 到Num的时候 变成了 NUM=1,这时候,线程睡眠,第2个线程也执行这个方法,访问的是同一个对象,由于NUM是静态的,访问的是同一个NUM, 执行NUM++  现在成num=2了.线程2开始睡眠,第一个线程,醒过来了,打印  System.out.println(name+", 你是第"+num+"个使用timer的线程");  得到 t1, 你是第2个使用timer的线程
       是这么解释的  我觉的也有道理.教程是要说明加锁
        synchronized(this){    
        num ++; 
        try { Thread.sleep(1); } 
        catch (InterruptedException e) {} 
        System.out.println(name+", 你是第"+num+"个使用timer的线程"); 
    }
        
      

  3.   

    把synchronized 去掉,就是两个2
    不去掉,就肯定是1、2
      

  4.   

    对不起啊,确实是 DZ007说的那样  我错了。 public class TestSync implements Runnable { 
      Timer timer = new Timer(); 
      public static void main(String[] args) { 
        TestSync test = new TestSync(); 
        Thread t1 = new Thread(test); 
        Thread t2 = new Thread(test); 
        t1.setName("t1"); 
        t2.setName("t2"); 
        t1.start(); 
        t2.start(); 
      } 
      public void run(){ 
        timer.add(Thread.currentThread().getName()); 
      } 
    } class Timer{ 
      private static int num = 0; 
      public void add(String name){ 
      
        num ++; 
        try { Thread.sleep(1); } 
        catch (InterruptedException e) {} 
        System.out.println(name+", 你是第"+num+"个使用timer的线程"); 
      
      }