聊聊SpringBoot的@Scheduled的并发问题

下面是详细讲解SpringBoot的@Scheduled的并发问题的完整攻略。

什么是@Scheduled

@Scheduled是Spring框架中用于定时任务的注解。使用该注解可以实现在指定的时间间隔或特定时间执行代码块。

@Schedule的并发问题

在使用@Scheduled注解时,可能会出现并发的问题。在Spring Boot 2.x版本中,@Scheduled注解默认为serial(串行)模式,即任务一定会等待上一个任务执行完成后再执行。但是在Spring Boot 1.x版本中,@Scheduled注解默认并发执行任务,不会进行等待。

因此,我们需要合理地配置@Scheduled注解的并发策略,以避免出现意外的并发问题。

并发策略

  1. SERIAL默认串行模式

串行模式的特点是一个任务执行完毕后,才会执行下个任务。这种模式比较适合那些需要考虑线程安全和数据一致性的场景。

在Spring Boot 2.x中,@Scheduled注解默认使用串行模式,所以不需要额外配置。

示例代码:

@Component
public class MyScheduledTasks {

    @Scheduled(fixedRate = 1000)
    public void task1() {
        System.out.println(Thread.currentThread().getName() + " task1 执行时间:" + new Date());
    }

    @Scheduled(fixedRate = 1000)
    public void task2() {
        System.out.println(Thread.currentThread().getName() + " task2 执行时间:" + new Date());
    }
}

以上示例代码中,task1和task2均使用了@Scheduled注解,并设置了相同的执行周期为1000毫秒。根据串行模式特性,task1执行完毕后,才会开始执行task2。

输出结果如下所示:

pool-1-thread-1 task1 执行时间:Wed Aug 25 10:44:53 CST 2021
pool-1-thread-1 task2 执行时间:Wed Aug 25 10:44:54 CST 2021
pool-1-thread-1 task1 执行时间:Wed Aug 25 10:44:54 CST 2021
pool-1-thread-1 task2 执行时间:Wed Aug 25 10:44:55 CST 2021
pool-1-thread-1 task1 执行时间:Wed Aug 25 10:44:55 CST 2021
pool-1-thread-1 task2 执行时间:Wed Aug 25 10:44:56 CST 2021

可以看到,task1和task2交替执行,且每个任务都等待上一个任务执行完毕后再开始执行。

  1. CONCURRENT并发模式

并发模式的特点是任务可以同时执行,不需要等待别的任务执行完毕之后再开始执行。但是这样会有一些风险,比如并发情况下可能会存在数据不一致的问题。

在Spring Boot 1.x版本中,@Scheduled注解默认使用并发模式,我们需要通过配置文件进行修改,将其改为串行模式。

在Spring Boot 2.x版本中,为了避免并发问题,@Scheduled注解新增了一个属性——mode,用来控制任务并发模式,可以配置为SERIAL或CONCURRENT。

示例代码:

@Component
public class MyScheduledTasks {

    @Scheduled(fixedRate = 1000, mode = TaskExecutionMode.CONCURRENT)
    public void task1() {
        System.out.println(Thread.currentThread().getName() + " task1 执行时间:" + new Date());
    }

    @Scheduled(fixedRate = 1000, mode = TaskExecutionMode.CONCURRENT)
    public void task2() {
        System.out.println(Thread.currentThread().getName() + " task2 执行时间:" + new Date());
    }
}

以上示例代码中,task1和task2都使用了@Scheduled注解,并设置了相同的执行周期为1000毫秒,并且将mode属性配置为TaskExecutionMode.CONCURRENT。

输出结果如下所示:

scheduling-1 task1 执行时间:Wed Aug 25 10:29:48 CST 2021
scheduling-1 task2 执行时间:Wed Aug 25 10:29:48 CST 2021
scheduling-1 task1 执行时间:Wed Aug 25 10:29:49 CST 2021
scheduling-1 task2 执行时间:Wed Aug 25 10:29:49 CST 2021
scheduling-1 task1 执行时间:Wed Aug 25 10:29:50 CST 2021
scheduling-1 task2 执行时间:Wed Aug 25 10:29:50 CST 2021

可以看到,task1和task2几乎同时执行,没有等待别的任务执行完毕之后再开始执行。

总结

在使用@Scheduled注解时,必须要考虑到并发的问题。可以通过配置@Scheduled注解的mode属性来控制任务的并发模式,以避免出现意外的并发问题。同时,在实际的开发中,还应该考虑到任务的线程安全性和数据一致性问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:聊聊SpringBoot的@Scheduled的并发问题 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 带你快速搞定java并发库

    带你快速搞定Java并发库 为什么要学习Java并发库 多线程是面向对象编程中非常重要的一个概念,能够很好地提高程序运行效率,特别是在大型应用中。在Java中,提供了Java并发库来实现多线程编程,同时能够避免线程安全问题。学习了Java并发库,可以更好地编写高质量的多线程程序。 学习Java并发库的基本知识 1. 线程的创建 Java并发库中的线程创建使用…

    多线程 2023年5月16日
    00
  • 深入浅析python中的多进程、多线程、协程

    深入浅析Python中的多进程、多线程、协程 Python中具有并发性的方式包括多进程、多线程和协程,每种方式都有优缺点。在本篇文章中,我们将会深入浅析这三种并发方式,并通过示例说明每种方式的使用。 多进程 多进程是指在操作系统中创建多个独立的进程进行任务的执行。每个进程之间都有自己独立的内存空间,相互之间不会干扰。Python多进程可以通过内置的multi…

    多线程 2023年5月17日
    00
  • Java多线程编程之CountDownLatch同步工具使用实例

    下面我将为大家详细讲解“Java多线程编程之CountDownLatch同步工具使用实例”的完整攻略。 一、CountDownLatch介绍 CountDownLatch是一种在多线程编程中非常常用的同步工具。 CountDownLatch的作用就是使得一个或多个线程在等待另外的线程执行完毕后才能继续执行下去。 CountDownLatch有两个重要方法: …

    多线程 2023年5月17日
    00
  • .net中线程同步的典型场景和问题剖析

    针对“.net中线程同步的典型场景和问题剖析”的话题,我来进行详细讲解,包括以下几个部分: 线程同步的概念 线程同步的必要性和作用 线程同步的实现方式 .net中线程同步的典型场景和问题剖析 示例说明 1. 线程同步的概念 线程同步是指在多个线程之间,对共享资源的访问进行协调和管理,以避免竞争条件和死锁等问题。 2. 线程同步的必要性和作用 当多个线程同时访…

    多线程 2023年5月16日
    00
  • 学习Java多线程之同步

    学习Java多线程之同步,首先需要明确什么是同步。同步是指在多个线程并发执行时,保证多个线程对共享资源的安全访问。下面是一个完整攻略,希望对您有所帮助。 目录 理解同步概念 实现同步 理解同步概念 在多线程环境下,由于线程的执行顺序不是我们能控制的,如果多个线程同时访问共享资源,可能会导致不可预料的行为。比如,每个线程都想更改同一个变量的值,那么变量的最终值…

    多线程 2023年5月16日
    00
  • 带你快速搞定java多线程(4)

    关于“带你快速搞定Java多线程(4)”这篇文章,下面我来给你详细讲解: 首先,这篇文章主要是讲解Java多线程中的线程池使用,包括线程池的定义、创建、使用和销毁等方面。下面从以下几个方面来介绍。 一. 线程池的定义 线程池是用于存放线程的池子,专门用于管理线程的创建、销毁和复用等工作。在Java程序中,线程池可以通过ThreadPoolExecutor类实…

    多线程 2023年5月17日
    00
  • 在apache下限制每个虚拟主机的并发数!!!!

    在 Apache 下限制每个虚拟主机的并发数可以通过修改 Apache 的配置文件实现。具体步骤如下: 打开 Apache 的配置文件 httpd.conf,找到以下两行内容: #LoadModule status_module modules/mod_status.so #ExtendedStatus On 取消注释并保存,使得服务器状态模块加载并开启扩展…

    多线程 2023年5月17日
    00
  • Java多线程及线程安全实现方法解析

    Java多线程及线程安全实现方法解析 简介 Java多线程是Java语言中最重要的功能之一,可以通过多线程实现一些高并发的业务需求。在实现多线程的同时,我们也需要关注线程安全,以保证多个线程之间的数据同步和共享。 本文将对Java多线程和线程安全做出深入的解析,包括:线程的概念、创建线程的方法、线程状态及生命周期、线程安全及实现方法等。 线程的概念 线程是一…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部