public class TT implements Runnable {
int b = 100;

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

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

public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}

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

tt.m2();
System.out.println(tt.b);
}
}
输出什么。。若把m2()方法前面的synchronized去掉呢
求分析一下

解决方案 »

  1.   

    输出b=1000
    去掉m2()方法前面的synchronized后
    输出b=2000
      

  2.   

    1 程序输出
    1000
    b=1000
    偶尔(很少)输出
    2000
    b=1000
    语句:
            t.start();  
            tt.m2();
    多数情况线程t滞后一点,m2()先执行。而m1()使用与m2()相同的锁,所以m2()执行时,m1()是在等待同步锁,而不执行。
    m2()执行完后,多数时线程t先于main抢到执行权,而执行m1(). 把b赋值1000后,进入休眠,main线程接着运行,输出 1000。main结束,t线程休眠结束后,输出b=1000. 程序结束。2     当把m2()前的synchronized 去掉后,输出
    2000 
    b=2000.
    因为两个线程没有同步,同时可被虚拟机调度执行。m1()执行时,b=1000,休眠5秒。而m2()执行时,休眠2.5秒后,b=2000. 这是最后赋值了。所以最后输出2000 b=2000. 程序结束。
      

  3.   

     在语句
    t.start();   
      tt.m2();
    之间加一句:
    Thread.sleep(2);  //就是让t线程先执行 (时间可自己调整)。
    结果又不一样了。楼主试试。