class MyThread extends Thread{
int id;
         static Object obj;

MyThread(int id){
this.id=id;
                if(obj == null){
                  obj =  = new Object();
                }
}
  public void run(){
                   synchronized (obj){
   for(int i=0;i<1000;i++){//为什么i为100的时候是同步的?
System.out.println("My id is "+id);
                  }
    }     
}
}

解决方案 »

  1.   

    你的synchronized 块的作用域太大了吧
      

  2.   

    谢谢hiking() ,可是为什么不能把整个方法都声明为同步化呢?让调用这个方法的线程同步了?
    zgysc:我觉得应该不是作用域的问题。书上也有将一个方法声明为同步化代码的例子。
      

  3.   

    同步会把方法切换到主线程执行
    同步run没有意义
      

  4.   

    你这个没有什么意义啊。
    创建了两个对象,不用synchronized 执行结果都是一样的
      

  5.   

    ngqzmjmj:不一样的,t1和t2先后被启动,程序按不确定的顺序输出:
    My id is 1和My id is 2。每一次运行结果都可能不一样。我的意思就是用同步的方法,先输出
    My id is 1
    My id is 1
    My id is 1
    ……
    再输出
    My id is 2
    My id is 2
    My id is 2
    ……
      

  6.   

    你把run同步了,用多线程还有什么用
      

  7.   

    知道了,多谢各位。
    今天在2002年程序员合订本里也看到关于次的说法:
    “提醒
        不要同步一个线程对象的run()方法,因为多线程需要运行run()。因为这些线程试图同步每一个对象,每个时间只有一个线程可以执行run()。结果是,每个线程都必须等待前一个线程终结之后才能访问run()。”