同步与异步、并发和并行、阻塞和非阻塞

152 阅读2分钟

同步与异步

同步和异步通常用来形容一次方法的调用。同步方法的调用必须等到该方法返回后才能继续接下来的行为。异步方法更像一个消息传递,一旦调用就会立即返回,调用者可以继续接下来的操作,而异步方法通常会在另一个线程中执行,不会妨碍调用者的工作。

public class SyncDemo {

    public static void main(String[] args) {
        //同步调用
        //模拟看电视和洗衣服两个行为,同步调用就是得先把衣服洗完了才能看电视,必须等待洗衣服方法的执行完成才能接着执行看电视方法
        SyncDemo.washClothes();
        SyncDemo.watchTV();
        //异步调用
        //类似于将衣服丢进洗衣机去洗,不用等待衣服洗完我就可以去看电视,两个方法可以同时执行
        new Thread(() -> SyncDemo.washClothes()).start();
        SyncDemo.watchTV();
    }

    //洗衣服方法
    public static void washClothes(){
        System.out.println("正在洗衣服");
        try {
            Thread.sleep(3000);//模拟洗衣服过程
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("衣服洗完了");
    }

    //看电视方法
    public static void watchTV(){
        System.out.println("看电视");
    }
}

并发和并行

并发和并行都可以表示多个任务一起执行,但是侧重点不同。并发偏重于多个任务交替执行,而多个任务有可能还是串行的,而并行是真正意义上的“同时执行”。如果系统只有一个CPU,而使用多线程任务,那么这些任务是不可能并行的,一个CPU一次只能执行一条命令,在这种情况下多线程就是并发的,而不是并行的。只有多个CPU的系统才会出现并行。

阻塞和非阻塞

阻塞和非阻塞是形容多线程间的相互影响。比如一个线程占用了临界区的资源,那么其他线程需要这个资源的线程就只能等待,等待会导致线程挂起,这就是阻塞。非阻塞就是与之相反,它强调没有一个线程可以妨碍其他线程执行,所有的线程都会尝试不断向前执行。