美文网首页
多线程执行顺序问题

多线程执行顺序问题

作者: 不知名的蛋挞 | 来源:发表于2019-01-13 23:04 被阅读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关键字,只保证了两个方法不会同时执行,但却无法保证二者到底谁先执行!

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

相关文章

  • 多线程顺序执行问题

    编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果...

  • 多线程执行顺序问题

    【问题】请解释下以下线程的执行顺序 【解释】 结果为 或 主线程启动了两个线程,由main线程生成了一个threa...

  • python——多线程

    多线程-threading 子类完成创建多线程 线程的执行顺序也是主线程和各个子线程随机执行,顺序不确定 线程对全...

  • 线程按指定顺序执行

    在多线程中线程的执行是CPU随机调度的,无法指定线程的执行顺序,比如我们要让多线程按顺序执行输出 这段代码的输出顺...

  • 多线程顺序执行

    第一种方法是join;第二种方法是线程池newSingleThreadExecutor final Thread ...

  • 多线程(1)

    多线程目的: 解决效率问题,我们平时写的代码,大多可以理解为单线程执行,即顺序执行,一个流程执行完成后,再执行另外...

  • 1.2.1线程的启动顺序与start()的执行顺序无关

    执行start()方法的顺序不代表线程启动的顺序。 执行结果 摘选自 java多线程核心编程技术-1.2.1

  • 并发

    保证多线程的顺序执行 方式1:通过join方法保证多线程的顺序join作用:让主线程等待子线程结束后才能继续运行 ...

  • 多线程代码执行先后的顺序问题

    前言多线程代码执行先后的是怎样的呢?我认为执行代码的先后顺序最外层的dispatch_sync(同步)和dispa...

  • 如何控制多线程执行的顺序?

    先看一段代码: 执行结果: 可以看到线程的执行顺序是随机的。查阅资料控制多线程执行顺序有以下两种方法: 方法1:调...

网友评论

      本文标题:多线程执行顺序问题

      本文链接:https://www.haomeiwen.com/subject/zrrrdqtx.html