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去掉呢
求分析一下
去掉m2()方法前面的synchronized后
输出b=2000
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. 程序结束。
t.start();
tt.m2();
之间加一句:
Thread.sleep(2); //就是让t线程先执行 (时间可自己调整)。
结果又不一样了。楼主试试。