多线程执行顺序问题

2019-01-13  本文已影响11人  不知名的蛋挞

【问题】请解释下以下线程的执行顺序

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关键字,只保证了两个方法不会同时执行,但却无法保证二者到底谁先执行!

从设计者的角度而言,如果两个事件需要顺序发生,那么一般不会将其分派到两个不同线程中执行!否则,需要的同步机制是比较复杂的。

上一篇 下一篇

猜你喜欢

热点阅读