求解这个程序,该怎么处理
阅读
- 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. 程序结束。
阅读
上一篇:JTextField setText 有关问题 下一篇:返回列表