线程同步、异步

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

线程同步与异步

在多线程编程中,线程同步和异步是两种基本的执行方式,它们决定了代码的执行顺序和时间。理解同步和异步对于设计和实现并发控制至关重要。

线程同步(Synchronous)

线程同步,顾名思义,是指线程按照某种固定的顺序执行。在同步操作中,一个线程的执行可能依赖于另一个线程的结果。因此,需要采取一定的机制来确保线程之间能够按照预定的顺序执行。

同步的特点:

  • 顺序性:操作必须按照一定的顺序执行,不能乱序。

  • 阻塞性:如果一个线程在等待某个条件满足(如等待另一个线程完成任务),它会被阻塞,直到条件满足。

  • 控制复杂性:同步操作通常需要更多的控制逻辑来管理线程间的交互,这可能会使得代码更加复杂。

同步的实现方式:

  1. synchronized关键字:在Java中,可以使用synchronized关键字来创建同步代码块或同步方法。

  2. Lock接口:Java提供了java.util.concurrent.locks.Lock接口,它提供了比synchronized更灵活的锁定机制。

  3. wait/notify机制:通过调用对象的wait()方法使线程等待,notify()notifyAll()方法唤醒等待的线程。

线程异步(Asynchronous)

与同步相对的是线程异步,它允许线程独立于其他线程运行,不需要等待其他线程的指令或结果。异步操作可以提高程序的并发性能,因为它们允许多个任务几乎同时执行。

异步的特点:

  • 独立性:每个线程都是独立的,执行自己的任务,不需要等待其他线程。

  • 非阻塞性:线程在执行时不会被阻塞,它们可以在等待操作完成时继续执行其他任务。

  • 复杂性管理:虽然异步操作可以提高效率,但管理和协调异步任务可能会变得复杂。

异步的实现方式:

  1. Future接口:通过java.util.concurrent.Future接口和ExecutorService,可以异步地执行任务,并在将来的某个时间点获取结果。

  2. CompletableFuture:Java 8引入了CompletableFuture,它提供了更丰富的API来处理异步编程。

  3. 回调函数:可以在操作完成时执行回调函数,这是异步编程中常用的模式。

示例

同步示例(synchronized关键字)

public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

异步示例(Future接口)

import java.util.concurrent.*;

public class AsyncDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        Future<Integer> future = executorService.submit(() -> {
            // 模拟长时间运行的异步任务
            TimeUnit.SECONDS.sleep(2);
            return 42;
        });

        // 异步任务正在执行,此时可以做其他事情
        // ...

        // 获取异步执行的结果,如果结果未准备好,这里会阻塞
        Integer result = future.get();
        System.out.println("异步任务的结果是: " + result);

        executorService.shutdown();
    }
}

在实际的软件开发中,选择同步还是异步取决于具体的应用场景和性能要求。通常,I/O密集型任务或者需要大量等待的任务适合使用异步方式,而对于需要保证数据一致性和顺序性的场景,则应该使用同步方式。

最后更新于