聊聊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日

相关文章

  • RocketMQ Broker实现高可用高并发的消息中转服务

    这里是 RocketMQ Broker 实现高可用高并发的消息中转服务的完整攻略: 1. 背景 RocketMQ 是阿里巴巴开源的分布式消息系统,目前在行业内使用非常广泛。在一个企业级应用程序中,系统的高可用性是至关重要的,这意味着您必须确保当出现硬件或软件故障时,系统将不会完全停止。为了实现高可用性,我们需要在消息中间件中引入 Broker 集群。 Roc…

    多线程 2023年5月17日
    00
  • python基础之并发编程(一)

    以下是“python基础之并发编程(一)”的完整攻略: 什么是并发编程 并发指的是程序的多个部分可以同时执行的能力。在计算机领域中,指的是通过多个线程或进程实现并行计算和任务处理。 并发编程是指在同一时间段内处理多个计算任务的编程方式,它涉及到多个线程或进程之间的协调和通信。在Python中,使用多线程和多进程都能实现并发编程。 Python中的多线程并发编…

    多线程 2023年5月17日
    00
  • 区块链智能合约中的并发性和并行性

    区块链智能合约是一个基于区块链技术的智能合约系统,在合同的实现中可以体现很强的并发性和并行性。下面将从并发性和并行性两个方面对其进行讲解。 并发性 并发性指的是在合约权限不冲突的情况下,多个交易可以同时得到确认和执行。由于一个区块链网络要处理很多交易,因此并发性对于保证系统的快速性和稳定性具有重要意义。 在区块链智能合约中,通过智能合约的定义和资源的强制限制…

    多线程 2023年5月16日
    00
  • Java并发内存模型详情

    Java并发内存模型详情 Java并发内存模型(Java Memory Model,JMM)描述了Java程序中多线程访问共享数据时所遵循的规则,是保证安全、正确的多线程程序的基础。本文将深入探讨Java并发内存模型的原理和重要概念,帮助读者全面理解Java并发编程的底层机制。 Java并发内存模型的概念 Java并发内存模型是建立在Java虚拟机规范之上的…

    多线程 2023年5月16日
    00
  • java并发中DelayQueue延迟队列原理剖析

    Java 并发中 DelayQueue 延迟队列原理剖析 DelayQueue 是 Java 并发包中提供的一种特殊队列,它能够在一定的时间内延迟一些操作的执行。下面就来深入了解一下 DelayQueue 的原理。 DelayQueue 的基本特点 DelayQueue 继承自 java.util.concurrent.Delayed 接口,它的元素必须要实…

    多线程 2023年5月17日
    00
  • springboot高并发下提高吞吐量的实现

    下面是我对于“springboot高并发下提高吞吐量的实现”的完整攻略。 概述 在高并发请求的场景中,提高应用的吞吐量是非常重要的,否则有可能扛不住峰值请求而导致服务宕机。下面讲解几个提高吞吐量的方式。 方式一:使用线程池 线程池的原理是重用已创建的线程来执行任务,避免了频繁的线程创建和销毁,提高了并发处理的效率。SpringBoot内置了Tomcat作为S…

    多线程 2023年5月16日
    00
  • 使用GDB调试多线程实例详解

    使用GDB调试多线程实例详解: 概述 在多线程中发现错误可能会很困难,因为多个线程可以相互影响。为了解决这个问题,可以使用GDB调试器。GDB是一个非常强大的调试工具,可以帮助开发人员调试各种类型的程序,包括多线程程序。在这里,我们将介绍如何使用GDB调试多线程程序。 安装GDB 首先,我们需要安装GDB调试器。在大多数情况下,GDB已经预装在Linux发行…

    多线程 2023年5月17日
    00
  • Ruby多线程编程初步入门

    Ruby多线程编程初步入门攻略 什么是多线程 多线程是指在同一个程序中运行多个线程(thread)。每个线程具有独立的运行路径,多个线程可以同时运行。 在多核 CPU 中,多线程可以充分利用 CPU 资源,提高程序的执行效率。 Ruby中的线程 在 Ruby 中,我们可以通过 Thread 类来创建线程。 比如,下面的例子中,我们创建了两个线程,分别输出不同…

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