两个代码的不同之处在于,第一个
public synchronized void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
}
有 synchronized ,而第二个
public synchronized void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
}
没有 synchronized ,一个关键字的区别导致了这两段代码运行的结果和顺序不同
synchronized的作用是,同步代码块时,一个时间内只能有一个线程得到执行,
这个是重点!
第一段代码的运行结果是
1000
b=1000
因为主函数是一个线程,m1()又是一个线程,此处的m2(),相当于一个方法,tt.m2()就是方法调用,是main这个线程的一部分,开始进入main(),主线程在运行,tt.start()表示建立了另一线程,我们知道只有调用run时线程才运行,但此时没有调用run(),只是相当于一个预备动作似的,接下来是调用tt。m2();
因为有synchronized关键字的关系,所以在这个时间只能运行这一个线程,此时的b为2000;等到m2()运行完成后,m1()线程开始运行,此时的b被赋值为1000,故是以上结果。
第二段代码,因为m2()前没有synchronized关键字,则在tt.start()后,线程m1()进入就绪,此时还是主线程,运行tt.m2(),但这里因为没有synchronized关键字,所以在m2()中,运行到Thread。spleep(2500)时,会暂停主线程,在2。5秒后运行m1(),注意,此时的m2()并没有运行完,只是到sleep()方法后突然停止运行m1(),而其后面的 b = 2000;这个语句没有运行到,所以此时的b还为100,进入m1()后,b又被赋值为1000,接下来又到了m1()中的Thread.sleep(5000),此时m1()这个线程又暂停,5秒后,又跳到m2()中,运行没有运行完的代码,即运行b=2000;所以此时的b的值为2000;
m2()运行完后就又回到m1()中运行其没有运行完的代码,即可输出b=2000; |