【问题】请解释下以下线程的执行顺序
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;
}
@Override
public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args)throws Exception {
TT tt = new TT();
Thread thread = new Thread(tt);
thread.start();
tt.m2();
System.out.println(tt.b);
}
}
【解释】
结果为
1000
b=1000
或
2000
b=1000
主线程启动了两个线程,由main线程生成了一个thread线程,两个线程虽然没有什么关联关系,但是新线程的启动肯定需要时间,虽然时间很短但是没有main线程直接继续运行来的快,所以是main线程优先进入了m2方法,由于m2方法是synchronized方法,即使thread线程初始化完成了,也要等待锁释放,等main线程的tt.m2();执行完成后,thread线程才可以执行。这时两个线程就并发执行了,如果thread执行的快,就会输出“1000”,否则,就会输出“2000”。但是由于thread线程因为等待了5秒,最后输出的肯定是“b=1000”。
其实就一句话:线程同步问题!
两个线程要是不进行同步,其中指令的执行顺序是不可预期的!也就是说:结果可能与你预期相同,也可能不同,同或不同,都属于概率事件!
具体而言:你这里用的synchronized关键字,只保证了两个方法不会同时执行,但却无法保证二者到底谁先执行!
从设计者的角度而言,如果两个事件需要顺序发生,那么一般不会将其分派到两个不同线程中执行!否则,需要的同步机制是比较复杂的。
网友评论