代码如下
public class Machine extends Thread{
    private int a=0;
    public void run(){
        for(a=0;a<10;a++){
            System.out.println(currentThread().getName()+":"+a);
            try{
                sleep(100);
            }catch(InterruptedException e){throw new RuntimeException(e);}
        }
    }
    public static void main(String args[]){
        Machine machine=new Machine();
        machine.start();
        machine.run();
    }
}
运行结果是:
main:0
Thread-0:0//为什么出现两次0了???
main:1
Thread-0:2
main:3
Thread-0:4
main:5
Thread-0:6
main:7
Thread-0:8
main:9疑问就是:为什么会出现两次0,不是两个线程都同时操作同一个实例变量吗?

解决方案 »

  1.   

    由于machine.start()要调用run方法,这需要时间,而machine.run()直接调用run方法,所以它先执行,即主线程main先将a赋值为0并打印出main:0,接着,主线程sleep0.1秒,这时轮到machine.start()调用run方法,又执行一次a=0,所以打印出Thread-0:0,完后它再sleep0.1秒,再接着主线程醒来,a++,输出main:1,再另一个线程醒来,a++,输出Thread-0:2,依次循环,直到a=9,输出main:9