public class TT implements Runnable {
int b=100;
public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}

public synchronized void m1() throws Exception{
b=1000;
Thread.sleep(5000);
System.out.println("b="+b);
}

public void m2() throws Exception{
Thread.sleep(2500);
b=2000;
}

public static void main(String[] args) throws Exception {
TT tt=new TT();
Thread t=new Thread(tt);
t.start();

tt.m2();
}
}输出b=2000;
m2方法前面 synchronized,输出b=1000;为什么是这两种结果,请大家帮忙分析一下。谢谢

解决方案 »

  1.   

    第一种情况,b = 2000  在b=1000; 执行,所以输出:b=2000
    第二种情况,由于m1和m2都是synchronized的,所以他们的执行是原子的,即不会相互交叉的。在m1中b=1000,之后该线程会一气执行完println,之间不会执行m2的。
      

  2.   

    第一种情况,b = 2000  在b=1000; 之后执行,所以输出:b=2000 
      

  3.   

    第一种情况:t.start()启动线程,调用锁定当前对象的方法m1(),得b=1000然后线程睡眠5秒,在此期间,主线程启动,调用m2(),而m2并未锁定当前对象,所以先睡2.5秒再可把b改为2000,主线程结束.五秒后m1醒来继续执行,打印出b,而此时b已经被m2改为了2000,所以打印出了2000;第二种情况:由于m1,m2都是synchronized的,所以这两个方法不能同时对当前对象进行操作,只有某一方法结束,解除锁定,另一方法才能执行.m1方法被调用后,直到该方法执行结束,才释放资源,所以,打印出的结果必定是b=1000;本情况中,m1,m2方法是异步执行的
      

  4.   

    简单点来说
    t和tt在同时睡觉前,t把b修改成1000
    tt比t早醒,然后tt把b修改成了2000
    t醒来后说出b的值
      

  5.   

    你的问题和synchronized 无关,哈哈,刚刚睡醒,上睡觉理论能看明白吧
      

  6.   

    你说和synchronized无关,但为什么两次结果不一样?