如这段代码:
class runner{
static Object obj = new Object();
void m(){
synchronized(obj){
for(int i = 0;i<=100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
synchronized(""){
for(int i = 101;i<=200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
void n(){
synchronized(obj){
for(int i = 101;i<=200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
}
public class Myjava {
    public static void main(String args[]){
     final runner r = new runner(); //No1:这个地方不明白,为什么要加final
     new Thread(){                  //No2:这个地方也不明白
     public void run(){
     r.m();
     }
     }.start();
     new Thread(){
     public void run(){
     r.n();
     }
     }.start();
    }
}
问题1) 在运行上述代码时,必须要线程1的两个方法m()和n()都运行结束了,线程2的n()方法才能够执行。这是怎么回事?线程1在执行synchronized(obj){}代码块时会把obj锁起来,所以线程2必须等待,这个我懂,但是等线程1的synchronized(obj){}代码块结束之后,这个obj锁就应该解开了吧,所以我觉得线程2此时就应该可以执行synchronized(obj){}代码块了,可为什么一定要等线程1全执行完才行啊?问题2) 在注释1的地方,为什么要加final,我试了一下,不加final就报错,这是为啥?问题30 在注释2的地方,这种new Thread(){ xxxxxxx }的写法算继承还是什么的,记得书上说创建线程就两种方法,一种是定义一个类implements Runnable接口,还有一种就是第一个类extends Thread类,这种写法算上面的哪一种?还有,在new Thread(){}内部的那个run()方法,算是重写么?

解决方案 »

  1.   

    No1:因为你匿名内部类里调用了该对象。
    No2:线程1的n方法在哪里?
      

  2.   

    No1.线程1中synchronized(obj){}运行完以后,线程2没有得到运行是因为cpu时间片没轮到它,不是因为被锁住了,你可以在}之后让m()方法sleep一小会,就会发现线程2是可以执行的void m(){
    synchronized(obj){
    for(int i = 0;i<=100;i++){
    System.out.println(Thread.currentThread().getName()+" "+i);
    }
    }
    synchronized(""){
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    for(int i = 101;i<=200;i++){
    System.out.println(Thread.currentThread().getName()+" "+i);
    }
    }
    }
    问题2和问题3实际是一个问题,就是内部类的使用,建议楼主看下内部类的相关知识,问题3实际是个匿名内部类,而问题2其实是匿名内部类中使用的变量必须声明为final
      

  3.   

    1 为什么要加final? 因为你在内部类里面用到了这个对象
    2 new Thread(){ xxxxxxx }的写法实际上是实例化了一个Thread对象,而且是个匿名类
      

  4.   

    大哥,我试了一下,只要让线程1的synchronized(obj){}运行完以后sleep一小会,线程2就可以执行了,但是必须要等线程2完全执行完了,线程1才接着执行,为什么不能交替执行呢?