当前位置: 代码迷 >> J2SE >> 求解这个程序,该怎么处理
  详细解决方案

求解这个程序,该怎么处理

热度:274   发布时间:2016-04-24 02:12:21.0
求解这个程序
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. 程序结束。

  相关解决方案