C++ 网络编程之一网络框架介绍
技术选型
常用的网络框架
Boost.Asio:Boost.Asio 是一个跨平台的 C++ 网络编程库,提供了异步 I/O 操作的抽象。它可以处理 TCP、UDP、SSL 等协议,并提供了丰富的异步操作和事件处理机制。
POCO C++ Libraries:POCO 是一个功能强大的 C++ 类库,其中包含了丰富的网络通信模块,包括 HTTP、SMTP、POP3、FTP 等协议的支持,以及 WebSocket、WebSocket Secure 等高级功能。
cpp-netlib:cpp-netlib 是一个轻量级的 C++ 网络编程库,提供了 HTTP、HTTP client、HTTP server 等模块。它设计简单,易于使用,并提供了现代 C++ 风格的 API。
Muduo:Muduo 是一个基于事件驱动的 C++ 网络库,用于构建高性能的服务器应用。它提供了事件循环、线程池、定时器、TCP/UDP 服务器等模块,可以处理大量的并发连接。
C++ REST SDK:C++ REST SDK 是由微软开发的一个 C++ 库,用于构建基于 HTTP 的服务和客户端。它提供了现代 C++ 风格的 API,并支持异步操作和并发处理。
Crow:Crow 是一个轻量级的 C++ 微型网络框架,用于构建 RESTful 风格的 Web 服务。它简单易用,适合快速开发小型的 Web 应用。
Beast:Beast 是 Boost 库的一部分,提供了现代 C++ 风格的 HTTP 和 WebSocket 功能。它设计简单,易于集成,并且具有高性能和可扩展性。
H2 数据库基础教程之一
Java 多线程编程之九 ThreadLocal 使用
大纲
- Java 多线程编程之一 Java 内存模型浅析
- Java 多线程编程之二 synchronize 锁对象竞争
- Java 多线程编程之三 volatile 与 JMM 内存模型
- Java 多线程编程之四 CAS、ABA 问题、锁
- Java 多线程编程之五 AQS 底层源码深度剖析
- Java 多线程编程之六集合类的线程安全问题
- Java 多线程编程之七队列、线程池、线程通信
- Java 多线程编程之八 Fork/Join 框架使用
- Java 多线程编程之九 ThreadLocal 使用
ThreadLocal 的介绍
- (1) 在 Java 中,ThreadLocal 是为每个线程独立存储变量的机制。它使得每个线程都能拥有一个独立于其他线程的变量副本,这样可以避免线程间的变量共享,从而保证线程安全。ThreadLocal 实例通常是类中的私有静态字段(属性),使用它的目的是希望将状态(例如,用户 ID 或者事务 ID)与线程关联起来。
- (2) ThreadLocal 实现了每一个线程都有自己专属的本地变量副本,主要解决了让每个线程都可以绑定自己的变量值。通过调用 ThreadLocal 的
get()
和set()
方法,获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。如果不使用 ThreadLocal 或者其他手段(比如加锁)来控制共享变量的并发修改,那么就会出现线程安全问题,其根本原因在于 Java 内存模型(JMM) 的结构。
Docker 安装 XXL-JOB
前言
初始化数据库
在 MySQL 执行 XXL-JOB GitHub 仓库中的 SQL 初始化脚本,初始化完成后一共有 8 张表。
表名称 | 描述 |
---|---|
xxl_job_group | 执行器信息表,用于维护任务执行器的信息 |
xxl_job_info | 调度扩展信息表,用于存储调度任务的扩展信息,比如任务分组、任务名、机器的地址等 |
xxl_job_lock | 任务调度锁表 |
xxl_job_log | 日志表,用于存储任务调度的历史信息,例如调度结果、执行结果、调度入参等 |
xxl_job_log_report | 日志报表,用于存储任务调度的日志报表,会在调度中心里的报表功能里使用到 |
xxl_job_logglue | 任务的 GLUE 日志,用于存储 GLUE 日志的更新历史变化,支持 GLUE 版本的回溯功能 |
xxl_job_registry | 执行器的注册表,用在维护在线的执行器与调度中心的地址信息 |
xxl_job_user | 系统的用户表,可以用表中默认的用户名与密码进行登录 |
XXL-JOB 入门教程之一
Java 多线程编程之八 Fork/Join 框架使用
大纲
- Java 多线程编程之一 Java 内存模型浅析
- Java 多线程编程之二 synchronize 锁对象竞争
- Java 多线程编程之三 volatile 与 JMM 内存模型
- Java 多线程编程之四 CAS、ABA 问题、锁
- Java 多线程编程之五 AQS 底层源码深度剖析
- Java 多线程编程之六集合类的线程安全问题
- Java 多线程编程之七队列、线程池、线程通信
- Java 多线程编程之八 Fork/Join 框架使用
- Java 多线程编程之九 ThreadLocal 使用
前言
在 Java 中,Fork/Join 框架(分支合并框架)是一种用于并行处理任务的强大工具,特别适用于那些可以递归地分解成更小任务的场景(如下图所示)。Fork/Join 框架基于 “工作窃取” 算法,允许空闲的线程从那些繁忙的线程那里窃取任务,以提高 CPU 的使用效率和程序的执行性能。
Maven 激活 SpringBoot 配置文件
Java I/O 模型详解
前言
Java 中有 3 种主要的 I/O 模型:同步阻塞 I/O(BIO)、同步非阻塞 I/O(NIO)和异步非阻塞 I/O(AIO),除了这 3 种主要的 I/O 模型,还有多路复用 I/O 模型和信号驱动模型。它们的区别主要在于处理 I/O 操作时线程的行为方式,以及应用程序对于 I/O 完成时的处理方式。
I/O 模型介绍
I/O 模型的简介
同步阻塞 I/O 模型(Blocking I/O,简称阻塞 I/O)是 Java 最早引入的模型之一,它的特点是在执行 I/O 操作时会阻塞当前线程,直到 I/O 操作完成才会继续执行后续代码。在同步阻塞 I/O 模型中,当一个线程调用读取操作时,如果没有数据可读,线程将一直阻塞在读取操作上,直到有数据到达为止。同样,当一个线程调用写入操作时,如果写缓冲区已满,线程将一直阻塞在写入操作上,直到有空间可用为止。同步阻塞 I/O 模型的优点是简单易用,但其缺点是效率较低,不适用高并发场景,因为线程在等待 I/O 操作完成时会被阻塞,无法处理其他任务。
同步非阻塞 I/O 模型(Non-blocking I/O,简称非阻塞 I/O)是对同步阻塞 I/O 模型(BIO)的改进,从 Java 1.4 开始支持。在同步非阻塞 I/O 模型中,当一个线程调用读取操作时,如果没有数据可读,线程不会被阻塞,而是立即返回一个错误码或空值。同样,当一个线程调用写入操作时,如果写缓冲区已满,线程也不会被阻塞,而是立即返回一个错误码。通过不断地轮询 I/O 操作的状态,同步非阻塞 I/O 模型可以实现在等待 I/O 操作完成的同时处理其他任务。同步非阻塞 I/O 模型的优点是能够提高系统的并发性能,但其缺点是需要频繁地轮询 I/O 操作的状态,会造成 CPU 资源的浪费,而且实现相对复杂,需要一定的编程技巧。这种模型适用于需要处理多个连接但每个连接比较短(轻操作)的场景,如实时通讯系统、聊天服务器等。
多路复用 I/O 模型(Multiplexing I/O)可以实现同时监控多个 I/O 操作的状态。Java 中的多路复用 I/O 一般是建立在同步非阻塞 I/O 模型(NIO)基础之上实现的,比如 Netty 网络编程框架。在多路复用 I/O 模型中,一个线程可以同时监听多个 I/O 操作的状态,当某个 I/O 操作就绪时,线程可以进行相应的读取或写入操作。通过这种方式,多路复用 I/O 模型可以在一个线程中处理多个 I/O 操作,提高系统的并发性能。多路复用 I/O 模型的优点是能够有效地减少线程的数量,降低系统资源的消耗,但其缺点是实现复杂度较高,需要一定的编程技巧。
异步非阻塞 I/O 模型(Asynchronous I/O,简称异步 I/O)是最高级别的 I/O 模型之一,性能和吞吐量最高,从 Java 1.7 开始支持。它通过将 I/O 操作的结果通知给应用程序,来实现非阻塞的 I/O 操作。在异步非阻塞 I/O 模型中,应用程序发起一个 I/O 操作后,不需要等待操作完成,而是可以继续执行其他任务。当 I/O 操作完成后,操作系统会通知应用程序,应用程序再进行相应的处理。异步非阻塞 I/O 模型的优点是能够充分利用系统资源,提高系统的并发性能,但其缺点是需要操作系统的支持,在某些操作系统(如 Windows)上的支持不如 NIO 成熟,对于编程人员来说,实现相对复杂。这种模型适用于需要处理多个连接且每个连接比较长(重操作),并且要求高性能、高并发的场景,例如高性能服务器、流媒体服务器等。