日期:2014-05-20  浏览次数:20768 次

求解这个程序
Java code

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去掉呢
求分析一下

------解决方案--------------------
输出b=1000
去掉m2()方法前面的synchronized后
输出b=2000
------解决方案--------------------
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. 程序结束。