【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(一)

在这里插入图片描述

➡️博客首页       https://blog.csdn.net/Java_Yangxiaoyuan


       欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。


       本文章CSDN首发,欢迎转载,要注明出处哦!


       先感谢优秀的你能认真的看完本文,有问题欢迎评论区交流,都会认真回复!


JDK21 中的虚拟线程到底是怎么回事

  • 一、✅典型解析
    • 1.1 ✅在 JDK21 有哪些库可以用于虚拟线程支持
    • 1.2 ✅虚拟线程和进程的区别是什么
    • 1.3 ✅为什么虚拟线程更适合用于处理大量并发的场景
    • 1.4 ✅JDK21中的其他并发编程模型
  • 二、✅拓展知识仓
    • 2.1 ✅JDK21中的其他并发编程模型是什么
    • 2.2 ✅为什么虚拟线程更适合用于处理大量并发的场景呢
    • 2.3 ✅虚拟线程和物理线程有什么区别
    • 2.4 ✅虚拟线程和物理线程哪个更好呢
    • 2.5 ✅虚拟线程的优缺点


一、✅典型解析


虚拟线程这个名字很多人可能比较懵,但是如果对像Go、Ruby、python等语言有一些了解的话,就会很快的反应过来,其实这就是协程。


在以前的JDK中,Java的线程模型其实比较简单,在大多数操作系统中,主要采用的是基于轻量级进程实现的一对一的线程模型,简单来说就是每一个Java线程对应一个操作系统中的轻量级进程,这种线程模型中的线程创建、析构及同步等动作,都需要进行系统调用。而系统调用则需要在 用户态 (UserMode)内核态 (Kernel Mode) 中来回切换,所以性能开销还是很大的。


而新引入的虚拟线程,是JDK 实现的轻量级线程,他可以避免上下文切换带来的的额外耗费。他的实现原理其实是JDK不再是每一个线程都一对一的对应一个操作系统的线程了,而是会将多个虚拟线程映射到少量操作系统线程中,通过有效的调度来游免那些上下文切换。


在JDK 21,有多种方法可以创建协程,如Thread.startVirtualThread()Executors.newVirtualThreadPerTaskExecutor() 等。


1.1 ✅在 JDK21 有哪些库可以用于虚拟线程支持


在 JDK 21 中,用于虚拟线程支持的库主要包括以下两个:


  1. Project Loom:这是 Oracle 正在开发的一个项目,旨在为 Java 添加轻量级线程(也称为虚拟线程或纤程)。虚拟线程是一种轻量级的线程,与常规线程相比,它们具有更低的创建和销毁成本,并且可以在共享执行环境中并发运行。Project Loom 提供了一个基于虚拟线程的并发模型,以简化并发编程和提高应用程序的可伸缩性。

  1. Quasar:另一个用于虚拟线程支持的库是 Quasar。Quasar 是一个开源项目,提供了基于 JVM 的纤程(fibre)和并行计算功能。它使用字节码转换技术来支持在 JVM 上运行轻量级线程,并提供了一套 API 和工具来简化并发编程。Quasar 支持与 Java 应用程序的集成,并且可以与现有的 Java 框架和库一起使用。

注意:JDK 21 本身并没有直接提供虚拟线程支持的库。这些库是作为单独的项目开发的,可能需要单独安装和使用。此外,这些库的具体实现和可用性可能随着时间的推移而有所变化,建议查看最新的官方文档以获取最准确的信息


1.2 ✅虚拟线程和进程的区别是什么


虚拟线程和进程在概念、资源占用、执行效率、系统开销等方面存在明显的区别。


  1. 概念:进程是操作系统中的一个执行实例,有独立的内存空间、虚拟地址空间等资源。虚拟线程是进程中的一条执行路径,用于完成特定任务。进程是一个容器,而线程则是容器内的执行单元。

  1. 资源占用:进程拥有独立的内存空间和资源,不同的进程之间通常是相互独立的。而线程共享相同的内存空间和其他资源,线程之间的通信和协作更加方便。

  1. 执行效率:由于线程之间的切换开销比进程之间的切换开销小,因此多线程编程通常比多进程编程效率更高。

  1. 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

以下是一个使用Java代码的详细解释:



/**
* @author xinbaobaba
* 展示了虚拟线程和进程的区别
*/
public class ProcessAndThreadComparison {
    public static void main(String[] args) {
        // 创建一个进程
        Process process = new Process();
        // 创建一个线程
        Thread thread = new Thread(() -> {
            // 线程执行的代码逻辑
        });

        // 启动进程
        process.start();
        // 启动线程
        thread.start();
    }
}

示例中:创建了一个进程和一个线程,并分别启动它们。下面我们分别解释进程和线程的不同点:


进程

  • 进程是一个独立的执行环境,拥有自己的内存空间、系统资源等。
  • 进程之间的资源是相互隔离的,一个进程的崩溃不会影响其他进程的执行。
  • 进程的创建和销毁需要较高的系统开销,因为需要分配和回收资源。
  • 进程之间通信需要通过特定的机制,如管道、消息队列等。

线程

  • 线程是进程中的一个执行路径,共享进程的内存空间和其他资源。
  • 线程之间的切换开销较小,因为它们共享相同的资源。
  • 线程的创建和销毁相对较快,系统开销较小。
  • 线程之间可以通过共享内存进行通信,协作更加方便。

通过以上代码和解释,我们可以看出虚拟线程和进程的区别主要在于资源占用、执行效率、系统开销等方面。在实际应用中,根据需求选择合适的方式来实现并发编程,以提高应用程序的性能和可伸缩性。


1.3 ✅为什么虚拟线程更适合用于处理大量并发的场景


虚拟线程更适合用于处理大量并发的场景,主要原因如下:


1. 更高的并发能力:虚拟线程由于其轻量级的特性,能够支持更高的并发能力。相比传统线程,虚拟线程的创建和销毁成本更低,使得能够同时处理更多的任务,更好地应对高并发场景。


2. 更好的资源利用:由于虚拟线程共享进程资源,可以更好地利用系统资源,避免资源的浪费。多个虚拟线程可以共享相同的内存空间和其他资源,使得资源利用率更高。

3. 更低的系统开销:与进程相比,虚拟线程的切换开销更小。在进行线程切换时,虚拟线程的上下文切换更加快速和高效,降低了系统开销,提高了处理大量并发任务的效率。


4. 更方便的编程模型:虚拟线程可以与现有的Java框架和库集成,提供更方便的并发编程模型。开发人员可以使用熟悉的Java语言和API进行编程,同时享受到虚拟线程带来的高并发优势。


总之,虚拟线程适合处理大量并发的场景,主要是因为它们能够提供更高的并发能力、更好的资源利用、更低的系统开销以及更方便的编程模型。这些优势使得虚拟线程成为处理高并发场景的理想选择。


1.4 ✅JDK21中的其他并发编程模型


JDK 21中的其他并发编程模型包括:


  1. Reactor模式:用于构建响应式应用程序,可以更好地处理大量并发请求。
  2. Actor模型:一种并发计算模型,通过消息传递的方式实现不同进程或线程之间的通信。
  3. Dataflow模型:一种基于数据流的编程模型,可以自动处理并行和并发问题。
  4. Promises和Futures模型:用于异步编程,可以避免回调地狱,使代码更加简洁易读。
  5. Phaser模型:用于协调多个并行任务,确保它们按顺序执行。
  6. Multicore并发模型:利用多核CPU的优势,通过并行处理提高程序性能。

这些模型在JDK 21中都有相应的实现和工具支持,可以帮助开发人员更好地处理并发问题,提高应用程序的性能和可伸缩性。选择合适的并发模型取决于具体的应用场景和需求。


二、✅拓展知识仓

2.1 ✅JDK21中的其他并发编程模型是什么


除了虚拟线程,JDK 21还提供了其他一些并发编程模型。以下是一些可能的例子:

  1. CompletableFuture:这是JDK 8中引入的一个类,用于处理异步编程和并发编程。它提供了一种简单的方式来编写非阻塞的代码,并且可以链式调用。
  2. Phaser:这是一个同步类,用于协调并行任务。它可以帮助你同步一组线程,以便它们可以一起完成某个任务。
  3. ForkJoinPool:这是JDK 7中引入的一个类,用于实现Fork/Join并发模式。这种模式可以将一个大任务分解成多个小任务,然后使用工作窃取算法将小任务分配给不同的线程,最后再将结果合并。

Demo:


import java.util.concurrent.*;

/**
* 
* 虚拟线程、CompletableFuture和Phaser
*/
public class ConcurrencyModelsComparison {
    public static void main(String[] args) {
        // 虚拟线程示例
        VirtualThread virtualThread = new VirtualThread();
        virtualThread.start();

        // CompletableFuture示例
        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
            // 异步执行的代码逻辑
            System.out.println("CompletableFuture task executed");
        });
        future.join(); // 等待异步任务完成

        // Phaser示例
        Phaser phaser = new Phaser(2); // 创建Phaser,初始阶段数为2
        phaser.register(); // 注册当前线程
        phaser.arriveAndAwaitAdvance(); // 等待所有线程到达并同步
        System.out.println("Phaser task executed");
    }
}

上面的代码,我们分别演示了 虚拟线程 、` CompletableFuture和Phaser的使用。以下是它们各自的特点:


虚拟线程


  • 虚拟线程是一种轻量级的线程,与常规线程相比具有更低的创建和销毁成本。
  • 虚拟线程可以在共享执行环境中并发运行,提供更好的并发能力。
  • 虚拟线程的切换开销较小,可以快速地在不同任务之间切换。
  • 虚拟线程可以与其他Java框架和库集成,提供更方便的并发编程模型。

CompletableFuture


  • CompletableFuture是Java 8引入的一个类,用于处理异步编程和并发编程。
  • 它提供了一种简单的方式来编写非阻塞的代码,通过链式调用来处理异步操作的结果。
  • CompletableFuture可以与其他并发模型(如虚拟线程)结合使用,以实现更复杂的并发逻辑。
  • 它提供了丰富的方法来处理异步任务的完成、异常处理等,使得代码更加简洁易读。

Phaser


  • Phaser是一个同步类,用于协调并行任务。
  • 它可以帮助你同步一组线程,以便它们可以一起完成某个任务。
  • Phaser通过阶段(phase)和参与者(participants)的概念来进行线程同步,能够处理更复杂的同步场景。
  • 它通常用于解决需要等待一组线程都完成才能继续执行的问题。

2.2 ✅为什么虚拟线程更适合用于处理大量并发的场景呢


虚拟线程更适合用于处理大量并发的场景,主要是因为它们具有以下优势:


  1. 轻量级:虚拟线程比传统线程更加轻量级,因此它们的启动和销毁的开销更小。在应用程序需要创建大量线程时,这种轻量级特性使得虚拟线程的性能更优。
  2. 高并发能力:由于虚拟线程的轻量级特性,它们能够支持更高的并发能力。这意味着应用程序能够更好地处理高并发场景,而不会因为过多的线程而消耗过多的系统资源。
  3. 低内存消耗:虚拟线程相比传统线程具有更低的内存消耗,这使得它们能够更好地支持大规模的并发编程。在处理大量并发任务时,低内存消耗有助于防止因资源不足而导致的性能瓶颈。
  4. 简化并发编程:虚拟线程的设计初衷是为了简化并发编程。通过提供更高级别的抽象,虚拟线程使得编写、维护和观察高吞吐量并发应用程序的工作量大大减少。这有助于提高开发人员的工作效率,并减少因并发编程复杂性而导致的错误。
  5. 高吞吐量:虽然虚拟线程不能提供比平台线程更快的代码执行速度,但它们能够通过数量优势实现更高的吞吐量。在并发任务数量较高(超过几千个),并且工作负载不绑定CPU的情况下,虚拟线程有助于提高典型服务器应用程序的吞吐量。这是因为这类应用程序由大量并发任务组成,这些任务通常花费大量时间等待。
  6. 与现有框架集成:许多服务器框架选择使用虚拟线程来自动处理请求,为每个传入请求创建一个新的虚拟线程,并在其中运行应用程序的业务逻辑。这种集成方式使得处理请求的现有Java代码可以轻松地在虚拟线程中运行,进一步简化了并发编程。

总结:注意:虚拟线程通过其轻量级、高并发能力、低内存消耗等特性,以及与现有框架的集成和简化并发编程的优势,使其成为处理大量并发的场景的理想选择。


2.3 ✅虚拟线程和物理线程有什么区别


虚拟线程和物理线程是计算机领域中的两个重要概念,它们在定义、资源占用、调度和并发性等方面存在明显的区别。


  1. 定义:物理线程是指实际的硬件执行线程,通常一个核心对应一个物理线程。虚拟线程则是在操作系统上创建的逻辑执行单元,它不直接对应特定的CPU核心或处理器。
  2. 资源占用:物理线程需要实际的处理器、内存和其他硬件资源来执行任务。虚拟线程则只需要一部分CPU时间片和内存资源,因为它并不直接对应一个硬件执行线程。
  3. 调度:物理线程由操作系统的调度器来分配处理器时间。虚拟线程则是由线程库或操作系统的用户级线程管理器来调度,这使得虚拟线程可以在不涉及内核切换的情况下进行线程切换。
  4. 并发性:物理线程是真正的并发执行,可以在多个处理器核心上同时执行不同的任务。虚拟线程在同一时间只能有一个线程在执行,它们的并发性是通过线程切换来实现的。
  5. 亲和性:物理线程可以绑定到特定的CPU核心或处理器,以提高性能。虚拟线程通常不与特定的CPU核心或处理器相关联。

物理线程是直接由硬件执行的线程,而虚拟线程是由操作系统上的线程库或用户级线程管理器创建的线程。虚拟线程提供了一种更高级别的抽象,使得并发编程更加简化,特别适合处理大量并发的场景。


好的,以下是一个使用Java代码的详细介绍,包括虚拟线程和物理线程的区别:

public class ThreadComparison {
    public static void main(String[] args) {
        // 创建物理线程
        Thread physicalThread = new Thread(() -> {
            // 物理线程执行的代码逻辑
            System.out.println("Physical thread task executed");
        });
        physicalThread.start();

        // 创建虚拟线程
        VirtualThread virtualThread = new VirtualThread();
        virtualThread.start();
    }
}

代码中,分别创建了一个物理线程和一个虚拟线程,并启动它们。以下是它们之间的主要区别:

物理线程

  • 物理线程是操作系统级别的线程,直接由硬件执行。
  • 物理线程的创建和销毁成本较高,因为需要分配和回收操作系统资源。
  • 物理线程可以直接访问操作系统资源,具有较高的权限。
  • 物理线程的调度由操作系统的调度器负责,具有较高的优先级。

虚拟线程

  • 虚拟线程是用户级别的线程,由线程库或用户级线程管理器创建。
  • 虚拟线程的创建和销毁成本较低,因为它们不需要直接分配操作系统资源。
  • 虚拟线程通常用于简化并发编程,提供更高级别的抽象。
  • 虚拟线程的调度由线程库或用户级线程管理器负责,可以更好地适应应用程序的需求。

总结:物理线程和虚拟线程的主要区别在于它们的级别、创建和销毁成本、调度方式和访问权限。物理线程是操作系统级别的线程,具有较高的权限和优先级,而虚拟线程是用户级别的线程,主要用于简化并发编程。在处理大量并发的场景时,虚拟线程由于其轻量级和高并发能力的特性,成为更好的选择

<br/

2.4 ✅虚拟线程和物理线程哪个更好呢


虚拟线程和物理线程各有优劣,哪个更好取决于具体的场景和需求。以下是对两者的一些比较:


虚拟线程的优点:


  1. 轻量级:虚拟线程的创建和销毁成本较低,适用于创建大量线程的场景。
  2. 高并发:由于虚拟线程的轻量级特性,它们能够支持更高的并发能力,适合处理大量并发的任务。
  3. 资源高效:虚拟线程只占用必要资源,有助于减少系统资源的浪费。
  4. 简化并发编程:虚拟线程提供更高级别的抽象,简化并发编程的工作量,减少出错的可能性。
  5. 与框架集成:许多服务器框架选择使用虚拟线程来处理请求,这有助于简化服务器应用程序的开发。

虚拟线程的缺点:


  1. 性能:由于虚拟线程不是直接由硬件执行,因此在某些情况下可能会降低性能。
  2. 资源限制:虚拟线程的数量通常受到操作系统或线程库的限制。
  3. 调度开销:虽然虚拟线程的切换开销相对较小,但在高并发场景下,大量的虚拟线程可能会导致调度器过载。
  4. 与操作系统交互:由于虚拟线程是在用户空间中运行的,因此在进行某些操作系统级别的操作时可能受限。

物理线程的优点:


  1. 性能:物理线程直接由硬件执行,执行效率通常较高。
  2. 资源绑定:物理线程可以绑定到特定的处理器或核心上,充分利用硬件资源。
  3. 低延迟:由于物理线程直接与硬件交互,因此在某些需要低延迟的场景中可能更有优势。
  4. 操作系统交互:物理线程可以直接与操作系统交互,进行系统级别的操作。

物理线程的缺点:


  1. 创建和销毁成本:物理线程的创建和销毁成本较高,不适合创建大量线程的场景。
  2. 资源消耗:每个物理线程都需要分配独立的处理器和内存资源,可能导致资源的过度消耗。
  3. 调度开销:物理线程的调度由操作系统的调度器负责,可能存在较大的调度开销。
  4. 编程复杂性:并发编程需要处理多线程间的同步和通信,可能增加开发的复杂性和出错的可能性。

总结:选择虚拟线程还是物理线程取决于具体的场景和需求。在处理大量并发的场景时,虚拟线程由于其轻量级和高并发能力的特性成为更好的选择。而在需要高性能、低延迟或直接与操作系统交互的场景中,物理线程可能更合适


2.5 ✅虚拟线程的优缺点


虚拟线程的优点主要包括:


  1. 轻量级:虚拟线程的创建和销毁成本较低,相比传统线程,它们更加轻量级。这使得在应用程序需要创建大量线程时,虚拟线程的性能优势更加明显。
  2. 高并发能力:由于虚拟线程的轻量级特性,它们能够支持更高的并发能力。这意味着应用程序能够更好地处理高并发场景,提高整体性能。
  3. 低内存消耗:虚拟线程相比传统线程具有更低的内存消耗,这使得它们能够更好地支持大规模的并发编程。
  4. 简化并发编程:虚拟线程提供更高级别的抽象,简化并发编程的工作量,减少出错的可能性。
  5. 与框架集成:许多服务器框架选择使用虚拟线程来处理请求,这有助于简化服务器应用程序的开发。

虚拟线程缺点


  1. 性能:虚拟线程不是直接由硬件执行,因此在某些情况下可能会降低性能。
  2. 资源限制:虚拟线程的数量通常受到操作系统或线程库的限制。
  3. 调度开销:虽然虚拟线程的切换开销相对较小,但在高并发场景下,大量的虚拟线程可能会导致调度器过载。
  4. 与操作系统交互:由于虚拟线程是在用户空间中运行的,因此在进行某些操作系统级别的操作时可能受限。

总体来说,虚拟线程在处理大量并发的场景时具有优势,但需要根据具体需求和应用场景进行权衡。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/326434.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开发设计和迭代管理效率提升:PDManer元数建模

一、引言 在复杂多变的软件开发全生命周期中&#xff0c;数据库设计与建模扮演着举足轻重的角色。这一环节不仅关乎数据存储效率和应用性能优化&#xff0c;而且对于系统架构稳健性及业务逻辑清晰化具有深远影响。因此&#xff0c;选择一款功能强大且高效的数据库建模工具至关…

01背包问题dp数组理解dp[i][j-w]

文章目录 一、01背包是什么&#xff1f;二、例子三、解决思路dp(动态规划) 一、01背包是什么&#xff1f; 有 n 件物品和一个最多能背重量为 w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。 每件物品只能用一次&#xff0c;求解将哪些物品装入背包…

Angular系列教程之MVC模式和MVVM模式

文章目录 MVC模式MVVM模式MVC与MVVM的区别Angular如何实现MVVM模式总结 在讨论Angular的时候&#xff0c;我们经常会听到MVC和MVVM这两种设计模式。这两种模式都是为了将用户界面(UI)和业务逻辑分离&#xff0c;使得代码更易于维护和扩展。在这篇文章中&#xff0c;我们将详细介…

【光波电子学】基于MATLAB的多模光纤模场分布的仿真分析

基于MATLAB的多模光纤模场分布的仿真分析 一、引言 &#xff08;1&#xff09;多模光纤的概念 多模光纤&#xff08;MMF&#xff09;是一种具有较大纤芯直径的光纤结构&#xff0c;其核心直径通常在10-50微米范围内。与单模光纤&#xff08;SMF&#xff09;相比&#xff0c;…

nginx基础面试题以及配置文件解析和命令控制

目录 1、nginx是什么 2、nginx的特点 3、为什么中国大陆有&#xff1a;百度、京东、新浪、网易、腾讯、淘宝等这么多用户使用nginx 4、nginx 的内部技术架构 上一期我们配置安装了nginx接着讲一下nginx配置文件的解析和nginx 命令控制 感谢观看&#xff01;希望能够帮助到…

用原型实现Class的各项语法

本人之前对Class一直不够重视。平时对原型的使用&#xff0c;也仅限于在构造函数的prototype上挂属性。原型尚且用不着&#xff0c;更何况你Class只是原型的一颗语法糖&#xff1f; 直到公司开始了一个webgis项目&#xff0c;使用openlayers。看了下openlayers的代码&#xff0…

Sectigo有几种入门https证书买一年送一月

https证书是由CA认证机构颁发的数字证书&#xff0c;对网站传输数据进行加密&#xff0c;维护互联网环境安全&#xff0c;消除浏览器“不安全”提示。Digicert、Thawte、Sectigo等都是知名的CA认证机构&#xff0c;颁发的https证书中有很多都是入门级的https证书&#xff0c;其…

蓝桥杯基础数据结构(java版)

引言 数据结构数据结构。所以数据结构是一个抽象的概念。其目的是为了更好的组织数据方便数据存储。下面我们来看一些简单的数据储存方式 输入和输出 这里先介绍java的输入和输出。简单引入&#xff0c;不过多详细介绍&#xff0c;等我单一写一篇的时候这里会挂上链接 简单的…

【乱七八糟的经验】【个人】打羽毛球如何球球都接稳

从发球开始&#xff0c;球拍就不要离开视线之外。 为了达到这个目的&#xff0c;在待机时右手小臂就需要抬起一个角度&#xff0c;让球拍能在视野右下角&#xff1a; 然后球来时&#xff0c;球如果高&#xff0c;视线往上看&#xff0c;视野角度上移&#xff0c;球拍也要随之上…

代码随想录算法训练营Day22 | 491.非递减子序列、46.全排列、47.全排列||

LeetCode 491 非递减子序列 本题思路&#xff1a;什么情况下要搜集结果&#xff0c;可以写一个判断函数&#xff0c;当大小大于2的时候&#xff0c;并且&#xff0c;是非递减的&#xff0c;才能加入结果集中。需要注意的就是树层的一个去重操作。 class Solution {List<Int…

【PHP】PHP利用ffmreg获取音频、视频的详细信息

目录 一、目的 二、下载并安装ffmreg 三、PHP代码 四、运行结果 一、目的 使用PHP利用ffmreg获取音频、视频的详细信息&#xff0c;音视频总时长、码率、视频分辨率、音频编码、音频采样频率、实际播放时间、文件大小。 二、下载并安装ffmreg 1、下载地址&#xff1a;htt…

现在00后开发人员不晓得加班为何事嘛?

我招了两个做HTML5开端开发的人员&#xff0c;是从培训机构招来的&#xff0c;按理说他们应该很努学很用样才对的。他们上班第一天我就跟他们讲&#xff0c;我们不需要上、下班打卡&#xff1b;你们也不必太过担心迟到或早退。因为我们搞开发的人员首先是按自己的工作任务完成情…

【23种设计模式应用场景汇总】

23种设计模式应用场景汇总 设计模式是一种在软件开发中解决特定问题的通用解决方案。下面我将尝试将23种设计模式融入到一个场景中&#xff1a; 假设我们正在开发一个在线购物系统&#xff0c;我们可以使用以下设计模式&#xff1a; 1. 工厂方法模式&#xff1a;当用户在网站上…

云贝教育 |【OceanBase】OBCA认证考试预约流程

一、OBCA账号登录/注册&#xff0c;链接 https://www.oceanbase.com/ob/login/mobile?gotohttps%3A%2F%2Fwww.oceanbase.com%2Ftraining%2Fdetail%3Flevel%3DOBCA 注册完之后&#xff0c;请点击右上“登录”进行实名认证 OBCA考试报名链接&#xff1a;https://www.oceanbase.…

IDEA2023的激活与安装(全网最靠谱,最快捷的方式)

前言&#xff1a; 相信很多小伙伴已经开始了java的学习之旅&#xff0c;想要更快乐的学习当然少不了IDEA这个得力的开发工具软件。但是IDEA是付费的&#xff0c;免费版功能有太少&#xff0c;怎么才能既免费&#xff0c;又能使用上正式版呢&#xff01;当然还是激活啦&#xf…

数据结构与算法之美学习笔记:48 | B+树:MySQL数据库索引是如何实现的?

目录 前言算法解析总结引申 前言 本节课程思维导图&#xff1a; 作为一个软件开发工程师&#xff0c;你对数据库肯定再熟悉不过了。作为主流的数据存储系统&#xff0c;它在我们的业务开发中&#xff0c;有着举足轻重的地位。在工作中&#xff0c;为了加速数据库中数据的查找速…

maven导入无法拉取所需依赖

maven导入无法拉取所需依赖 1.原因2.解决搞定收工&#xff01; 1.原因 公司使用的是gradle&#xff0c;配置的私有云&#xff0c;maven里面配置私有云完全使用不了&#xff0c;无论配置国内还是国外的&#xff0c;导入的项目报错拉不到jar包。 <mirror><id>mirro…

【小智好书分享• 第一期】深度学习计算机视觉

目录 一、内容简介二、内页插图三、书籍目录四、粉丝福利 &#x1f389;博客主页&#xff1a;小智_x0___0x_ &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f389;系列专栏&#xff1a;好书分享 &#x1f389;代码仓库&#xff1a;小智…

汇编代码生成和编译器的后端

1.前置程序&#xff1a;语义分析和中间代码生成 基于SLR(1)分析的语义分析及中间代码生成程序-CSDN博客https://blog.csdn.net/lijj0304/article/details/135097554?spm1001.2014.3001.5501 2.程序目标 在前面编译器前端实现的基础上&#xff0c;将所生成的中间代码翻译成某…

Windows11搭建Python环境(2)- Anaconda虚拟环境中安装Git

在搭建MetaGPT运行环境过程中&#xff0c;使用了Anaconda虚拟环境&#xff0c;在运行MetaGPT时出现错误&#xff1a; 可以看到是没有找到git指令。 在Windows上安装Git&#xff0c;可以直接去官网下载.exe文件&#xff0c;然后安装即可。 但是上面安装完成后&#xff0c;是无…