为什么结果是100和a=1000,而不是1000和a=1000?请高手帮忙解决,谢谢public class TestDeadLockSuper implements Runnable{
int a=0;
Test1 t=new Test1();
public static void main(String[] args) {
TestDeadLockSuper td1=new TestDeadLockSuper();
TestDeadLockSuper td2=new TestDeadLockSuper();

td1.a=0;
    td2.a=1;
    
Thread t1= new Thread(td1);
    Thread t2=new Thread(td2);
    
    
t1.start();

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
public void run(){
if(a==0){
t.setB();
}else{
t.printB();
}

}
}
class Test1{
public int b=100;
public synchronized void setB(){
b=1000;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b="+b);
}
public void printB(){
System.out.println(b);

}
}

解决方案 »

  1.   

    分析一下:
    本程序启动后一共会有三个线程,主线程main,子线程t1,t2
    首先主线程运行到t1.start();
    说明t1线程处于就绪状态,然后执行到Thread.sleep(1000);
    主线程会进行1000ms睡眠状态,t1线程开始运行,执行setB方法
    执行到Thread.sleep(5000);线程t1会进入5000ms的睡眠状态,比主线程睡眠时间长,所以之后
    运行主线程,main继续,会启动t2线程,主线程结束,但t1的睡眠时间还没到,故会执行printB方法
    输入100,t2线程结束,t1线程继续,输入b=1000
    其中setB方法虽然睡眠,但已经执行b=1000,为什么printB时还是100呢,
    每个线程都可以看成单独运行的程序,有属于自己的临时缓冲区,你执行b =1000,但锁没有释放,
    所以变量的值并不会被写到同步线程的公共缓冲区中,t2线程自然得不到你更新的值
      

  2.   

    程序很简单,问题的关键在 Test1 t=new Test1();t1,t2操作的是两个test1对象,这和线程没有什么关系.
    楼上别把问题搞复杂了
      

  3.   

    LS说的对,只是线程2先执行完成而已,如果没有Thread.sleep(5000),就应该是a=1000和100