我先贴上代码,再问问题
public class Test{
public static void main(String[] agrs){
//Timer timer = new Timer();
     TestSync test1 = new TestSync(new Timer());
     TestSync test2 = new TestSync(new Timer());
System.out.println(test1 == test2);
     Thread t1 = new Thread(test1);
     Thread t2 = new Thread(test2);
     t1.setName("t1"); 
     t2.setName("t2");
     System.out.println(t1.getId()+"  "+t2.getId());
     t1.start(); 
     t2.start();

}
}class TestSync implements Runnable {
    Timer t;
    TestSync(Timer t){
    this.t = t;
    }
    public void run(){
    t.add(Thread.currentThread().getName());
  }
}class Timer{
  private static int num = 0;
  public synchronized void add(String name){ 
   //synchronized (this) {
    num ++;
    try {Thread.sleep(1);} 
    catch (InterruptedException e) {}
    System.out.println(name+", 你是第"+num+"个使用timer的线程");
  //}
  }
}
这里的
TestSync test1 = new TestSync(new Timer());
TestSync test2 = new TestSync(new Timer());
的参数如果换上前面的Timer timer = new Timer();结果就大不一样,我不知道这个构造参数是怎么影响这个结果的呢?请知道的说说两个结果分别都是怎么来的,谢谢了

解决方案 »

  1.   

    当然不一样了,当用 Timer timer = new Timer(); 时, 两个test用的是同一个timer。当用 new Timer()) 时, 两个test用的是不同的timer。
      

  2.   

    这个我也知道的,有没有细致点的?只是知道这点对结果我还是不能解释啊,还有去掉aynchronized那行呢
      

  3.   

    aynchronized
    这个是使add()方法同步的,既只能同时有一个线程操作add方法
      

  4.   

    你实现的是Runnable接口,不能直接调用run 方法
      

  5.   

    第一种情况:
        TestSync test1 = new TestSync(new Timer());
        TestSync test2 = new TestSync(new Timer());
    Timer类中的aynchronized没有起到作用,两个进程都可以同时调用add(String name)方法。
    由于
    private static int num = 0;
    表示num这个变量为所有Timer类的实例共享,当有一个线程得到CPU运行时而被JVM调用run方法来启动后(可能是test1也有可能是test2,这里假设是test1),接着test1调用add方法,num加1,变成num=1,这时test1休眠1秒,这1秒中,test2也启动了并调用add方法,由于num是共享的,所以num在test2调用add方法之前的值就为1,num++之后,num=2,所以test1和test2都是第2个使用timer的线程第二种情况:
        Timer timer = new Timer();
        TestSync test1 = new TestSync(timer );
        TestSync test2 = new TestSync(timer );
    表示这两个线程共享同一个资源(timer ),aynchronized在这里起到同步的作用,也就是在同一时间内只能由一个线程调用add方法,假设是test1先启动,test2就必须等test1调用完add方法之后才能调用add方法,所以第一个进来的num=1,第二个进来的num=2