Java 系统设计:如何应对高并发场景?
Java 系统设计:如何应对高并发场景?
在现代互联网应用中,高并发场景已经成为系统设计中不可避免的挑战。无论是电商秒杀、抢票系统,还是实时数据处理平台,高并发场景都对系统的性能、稳定性和扩展性提出了极高的要求。本文将深入探讨如何通过 Java 系统设计应对高并发场景,并提供代码示例来说明关键技术和优化策略。
高并发场景下的核心挑战
在高并发场景下,系统通常面临以下核心挑战:
- 性能瓶颈:系统无法在短时间内处理大量请求,导致响应延迟或服务不可用。
- 线程安全:多线程环境下,共享资源的访问可能导致数据不一致或竞态条件。
- 资源竞争:高并发访问会导致数据库连接池耗尽、缓存击穿等问题。
- 数据一致性:分布式系统中,如何保证数据在多个节点间的一致性。
为了应对这些挑战,我们需要从架构设计、并发编程、数据库优化和缓存策略等多个方面入手。
线程池优化:合理配置线程池参数
线程池是 Java 中处理并发请求的核心组件之一。在高并发场景下,线程池的配置直接影响系统的性能和稳定性。以下是一个线程池优化的示例:
import java.util.concurrent.*;public class ThreadPoolExample {public static void main(String[] args) {// 合理配置线程池参数int corePoolSize = Runtime.getRuntime().availableProcessors() * 2;int maximumPoolSize = corePoolSize * 2;long keepAliveTime = 60L;TimeUnit unit = TimeUnit.SECONDS;BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(1000);ThreadFactory threadFactory = Executors.defaultThreadFactory();RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory,handler);// 模拟高并发任务for (int i = 0; i < 10000; i++) {int taskId = i;threadPool.execute(() -> {System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Task " + taskId + " completed");});}threadPool.shutdown();}
}
关键点分析:
- 核心线程数和最大线程数:根据 CPU 核心数动态计算,避免资源浪费。
- 队列大小:限制任务队列大小,防止内存溢出。
- 拒绝策略:使用
CallerRunsPolicy
,让调用线程处理任务,避免任务丢失。
锁优化:乐观锁与分布式锁
在高并发场景下,传统的悲观锁(如 synchronized
)会导致大量线程阻塞,影响性能。可以使用乐观锁(如 AtomicInteger
)或分布式锁(如 Redisson)来优化。
乐观锁示例
import java.util.concurrent.atomic.AtomicInteger;public class OptimisticLockExample {private AtomicInteger count = new AtomicInteger(0);public void increment() {// 使用 compareAndSet 实现乐观锁int current;int next;do {current = count.get();next = current + 1;} while (!count.compareAndSet(current, next));}public static void main(String[] args) throws InterruptedException {OptimisticLockExample example = new OptimisticLockExample();// 模拟高并发场景Runnable task = () -> {for (int i = 0; i < 1000; i++) {example.increment();}};Thread[] threads = new Thread[100];for (int i = 0; i < threads.length; i++) {threads[i] = new Thread(task);}for (Thread thread : threads) {thread.start();}for (Thread thread : threads) {thread.join();}System.out.println("Final count: " + example.count.get()); // 应该是 1000 * 100 = 100000}
}
分布式锁示例(使用 Redisson)
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class DistributedLockExample {private static final String LOCK_KEY = "my_lock";private static final int LOCK_WAIT_TIME = 10000; // 等待锁的时间(毫秒)private static final int LOCK_LEASE_TIME = 30000; // 锁的持有时间(毫秒)public static void main(String[] args) {// 配置 Redisson 客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redisson = Redisson.create(config);RLock lock = redisson.getLock(LOCK_KEY);// 模拟高并发任务Runnable task = () -> {try {// 尝试获取锁boolean isLocked = lock.tryLock(LOCK_WAIT_TIME, LOCK_LEASE_TIME, TimeUnit.MILLISECONDS);if (isLocked) {System.out.println("Thread " + Thread.currentThread().getName() + " acquired the lock");// 执行业务逻辑Thread.sleep(1000);} else {System.out.println("Thread " + Thread.currentThread().getName() + " failed to acquire the lock");}} catch (InterruptedException e) {e.printStackTrace();} finally {// 释放锁if (lock.isHeldByCurrentThread()) {lock.unlock();System.out.println("Thread " + Thread.currentThread().getName() + " released the lock");}}};// 启动多个线程模拟高并发for (int i = 0; i < 10; i++) {new Thread(task).start();}}
}
关键点分析:
- 乐观锁:通过
AtomicInteger
的compareAndSet
方法实现无锁并发,避免线程阻塞。 - 分布式锁:使用 Redisson 实现分布式锁,确保在分布式环境下数据一致性。
缓存策略:解决缓存穿透与缓存雪崩
缓存是高并发场景下的重要优化手段,但缓存穿透(查询不存在的数据)和缓存雪崩(大量缓存同时过期)是常见的问题。以下是解决这些问题的策略和代码示例。
缓存穿透解决方案
import java.util.concurrent.TimeUnit;public class CachePenetrationExample {private final Cache<String, String> cache = new Cache<>();public String getData(String key) {// 先从缓存中获取数据String value = cache.get(key);if (value != null) {return value;}// 如果缓存中没有数据,查询数据库String dbValue = queryDatabase(key);// 如果数据库中也没有数据,将空值存入缓存(设置较短的过期时间)if (dbValue == null) {cache.put(key, "", 60, TimeUnit.SECONDS); // 缓存空值,过期时间 60 秒return null;}// 将数据库查询结果存入缓存cache.put(key, dbValue, 300, TimeUnit.SECONDS);return dbValue;}private String queryDatabase(String key) {// 模拟数据库查询System.out.println("Querying database for key: " + key);// 假设数据库中没有数据return null;}public static void main(String[] args) {CachePenetrationExample example = new CachePenetrationExample();// 模拟缓存穿透场景for (int i = 0; i < 100; i++) {new Thread(() -> {example.getData("nonexistent_key");}).start();}}
}
缓存雪崩解决方案
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;public class CacheSnowstormExample {private final ConcurrentHashMap<String, String> cache = new ConcurrentHashMap<>();private final AtomicInteger cacheVersion = new AtomicInteger(0);public String getData(String key) {// 先从缓存中获取数据String value = cache.get(key);if (value != null) {return value;}// 如果缓存中没有数据,查询数据库String dbValue = queryDatabase(key);// 将数据库查询结果存入缓存,设置随机过期时间int randomExpireTime = 300 + (int) (Math.random() * 100); // 随机过期时间 300-400 秒cache.put(key, dbValue);// 使用版本号避免缓存雪崩cacheVersion.incrementAndGet();return dbValue;}private String queryDatabase(String key) {// 模拟数据库查询System.out.println("Querying database for key: " + key);return "value_" + key;}public static void main(String[] args) {CacheSnowstormExample example = new CacheSnowstormExample();// 模拟缓存雪崩场景for (int i = 0; i < 100; i++) {new Thread(() -> {example.getData("key_" + (int) (Math.random() * 10));}).start();}}
}
关键点分析:
- 缓存穿透:通过缓存空值解决,设置较短的过期时间。
- 缓存雪崩:通过随机过期时间和版本号机制避免大量缓存同时过期。
数据库优化:连接池与分库分表
在高并发场景下,数据库通常是性能瓶颈之一。通过使用连接池和分库分表策略,可以显著提升数据库的处理能力。
数据库连接池优化
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;public class DataSourceExample {public static void main(String[] args) {HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/test");config.setUsername("root");config.setPassword("password");config.setMaximumPoolSize(50); // 最大连接数config.setMinimumIdle(10); // 最小空闲连接数config.setIdleTimeout(30000); // 空闲超时时间(毫秒)config.setMaxLifetime(1800000); // 连接最大生命周期(毫秒)config.setConnectionTimeout(30000); // 获取连接超时时间(毫秒)HikariDataSource dataSource = new HikariDataSource(config);// 模拟高并发数据库操作for (int i = 0; i < 100; i++) {new Thread(() -> {try (Connection connection = dataSource.getConnection()) {System.out.println("Thread " + Thread.currentThread().getName() + " acquired connection");// 执行数据库操作Thread.sleep(100);} catch (SQLException | InterruptedException e) {e.printStackTrace();}}).start();}}
}
分库分表策略
import java.util.HashMap;
import java.util.Map;public class ShardingExample {private final Map<Integer, DataSource> dataSources = new HashMap<>();public ShardingExample() {// 初始化多个数据源for (int i = 0; i < 10; i++) {HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/shard" + i);config.setUsername("root");config.setPassword("password");dataSources.put(i, new HikariDataSource(config));}}public DataSource getDataSource(int shardKey) {// 根据 shardKey 计算分片int shardId = shardKey % dataSources.size();return dataSources.get(shardId);}public static void main(String[] args) {ShardingExample example = new ShardingExample();// 模拟分库分表操作for (int i = 0; i < 100; i++) {new Thread(() -> {int shardKey = (int) (Math.random() * 1000);DataSource dataSource = example.getDataSource(shardKey);try (Connection connection = dataSource.getConnection()) {System.out.println("Thread " + Thread.currentThread().getName() + " acquired connection from shard " + (shardKey % 10));// 执行数据库操作Thread.sleep(100);} catch (SQLException | InterruptedException e) {e.printStackTrace();}}).start();}}
}
关键点分析:
- 连接池优化:通过合理配置连接池参数,避免数据库连接耗尽。
- 分库分表:通过哈希算法将数据分散到多个数据库,提升处理能力。
总结
在高并发场景下,Java 系统设计需要从多个层面进行优化:
- 线程池:合理配置线程池参数,避免资源耗尽。
- 锁优化:使用乐观锁和分布式锁解决资源竞争问题。
- 缓存策略:通过缓存穿透和缓存雪崩的解决方案提升性能。
- 数据库优化:使用连接池和分库分表策略提升数据库处理能力。
通过本文提供的代码示例和优化策略,开发者可以在实际项目中有效应对高并发场景,提升系统的性能和稳定性。希望这些内容对您有所帮助!
相关文章:
Java 系统设计:如何应对高并发场景?
Java 系统设计:如何应对高并发场景? 在现代互联网应用中,高并发场景已经成为系统设计中不可避免的挑战。无论是电商秒杀、抢票系统,还是实时数据处理平台,高并发场景都对系统的性能、稳定性和扩展性提出了极高的要求。…...
VR 全景多维赋能,众趣科技助力零售业开启购物新时代
说到商铺这个词,最早形成于春秋战国时期,当时还未形成固定位置的商铺,部分有远见的商人会在人流量较大的区域摆设摊位,促进了城市的繁荣。到了唐宋时期,商铺进一步发展,并随着商品经济的发展和城市人…...
五大生产模式(MTS、MTO、ATO、ETO、CTO)的差异
五大生产模式(MTS、MTO、ATO、ETO、CTO)差异 一、 库存控制二、 订货提前期三、交期与库存分析四、五大生产模式的产品生命周期 一、 库存控制 ETO 模式侧重于原材料库存管理,以应对定制设计所需的物料供应。 MTO 模式重点是原材料库存&…...
clickhosue中json字符串转为表
将json字符串直接通过sql转为表,这里就可以直接把接口来的数据,直接通过clickhouse进行关联查询了。 -- 将json字符串直接通过sql转为表,这里就可以直接把接口来的数据,直接通过clickhouse进行关联查询了。 WITH -- 解析 JSON 数据为字符串json_data AS (SELECT [{"c…...
二叉树的基本功能实现
一.二叉树的结构及实现 1.二叉树的结构 在之前的章节中已经介绍过,二叉树是一种特殊的树,其最大度为2,及最多有左,右两个孩子,结构图如下 在此之前已经讨论过一些特殊的二叉树,这里讨论一般的二叉树 2.…...
VSCode 降低适用版本并且关闭自动更新
VSCode 降低适用版本并且关闭自动更新 相关链接问题描述解决方法下载安装包关闭自动更新 参考链接 相关链接 VSCode 官网 问题描述 无法正常使用vscode-remote插件远程连接Centos7等一些老版本Linux云服务器(如Centos7) 从2024年1月,vsco…...
OpenHarmony - 小型系统内核(LiteOS-A)(二)
OpenHarmony - 小型系统内核(LiteOS-A)(二) 三、基础内核 3.1、中断及异常处理 基本概念 中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。即在程序运行过程中,出现了一个必须…...
2025第十六届蓝桥杯PythonA组部分题解
试题A:数字求和 题目描述 给定两个整数a和b,输出它们的和。 输入格式:两个整数,空格分隔 输出格式:一个整数 输入输出样例 输入: 5 8输出: 13解题思路 直接使用加法运算符计算两数之和。…...
苍穹外卖day04
Spring Task实现定时处理订单状态 作用:不需要输入提示信号,便可定时自动执行程序 使用步骤 1、启动类上加上注解(EnableScheduling)开启定时任务调度 2、专门创建一个包来管理执行定时任务的类,该类需要交给IOC容…...
曲线与曲面的绘制
一、学习目标 (1)掌握常用规则参数曲线与曲面的编程绘制方法。 (2)掌握自由曲线与曲面的编程绘制方法。 (3)了解自由曲面的拼接编程方法。 二、学习内容 (1)编程绘一个规则参数…...
Python Cookbook-6.2 定义常量
任务 你需要定义一些模块级别的变量(比如命名的常量),而且客户代码无法将其重新绑定。 解决方案 你可以把任何对象当做模块一样安装。将下列代码存为一个模块const.py,并放入你的Python的sys.path 指定的目录中: class _const(object):class ConstEr…...
【信息系统项目管理师】高分论文:论信息系统项目的范围管理(信息化系统综合管理平台)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划范围管理2、收集需求3、定义范围4、创建WBS5、确认范围6、控制范围论文 2017年6月,我作为项目经理参与了 XX市经济和信息化委员会系统综合管理平台建设项目,该项目投资共150万元人民币,建设工期…...
用Webpack 基础配置快速搭建项目开发环境
Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具,但是Webpack有大量的配置项,对新手不太友好,但是我们可以根据webpack-cli的init命令根据项目需求快速生成webpack的配置文件,本文将手把手教你如何用 Webpack 和 npm 快…...
【LLM Agent】SystemMessage 和 HumanMessage
文章目录 SystemMessage 和 HumanMessageSystemMessage(系统消息)HumanMessage(用户消息)结合使用高级设置能否将用户消息(HumanMessage)写在系统消息(SystemMessage) SystemMessage…...
机器学习核心知识:从基础概念到关键算法
摘要 本文深度剖析机器学习知识体系,从基本概念、学习方式,到分类算法、逻辑回归等关键内容均有涉及。详细阐述各知识点原理与应用场景,并对比多种算法的优劣。 关键词:机器学习;监督学习;分类算法&#x…...
信奥赛之c++基础(for与if的嵌套使用)
🍭 糖果工厂大闯关——for与if的嵌套魔法 🚚 第一章:快递站的故事(情景引入) 📦 快递分拣员小明 快递站每天要处理100个包裹,小明发现: 有些包裹要立即派送(红色标签)有些包裹可以暂存仓库(蓝色标签)for (int 包裹号=1; 包裹号<=100; 包裹号++) {if (包裹颜…...
凡泰极客亮相QCon2025鸿蒙专场,解析FinClip“技术+生态”双引擎
2025年4月10日,备受瞩目的QCon开发者技术峰会盛大举行,本次活动开设鸿蒙专场以“HarmonyOS NEXT 创新特性与行业实践”为主题,汇聚了众多鸿蒙生态的领军人物与技术专家,共同探讨鸿蒙操作系统的技术创新与行业应用。 凡泰极客CTO徐…...
day25 学习笔记
文章目录 前言一、图像翻转二、图像的仿射变换1.仿射变换的原理2.仿射变换函数3.图像旋转4.图像平移5.图像缩放6.图像剪切 三、插值方法1.最近领插值2.双线性插值法3.双三次插值4.代码展示 前言 通过今天的学习,我掌握了OpenCV中有关图像翻转,图像仿射变…...
Docker构建go-web应用
https://www.liwenzhou.com/posts/Go/deploy-in-docker/#c-0-4-0 本文介绍了如何使用Docker以及Docker Compose部署我们的 Go Web 程序。 Docker部署示例 准备代码 这里我先用一段使用net/http库编写的简单代码为例讲解如何使用Docker进行部署,后面再讲解稍微复杂…...
人工智能100问☞第4问:人工智能与机器学习、深度学习的区别?
目录 一、通俗解释 二、专业解析 三、权威参考 人工智能(AI)是目标:让机器具备智能(如建造一辆车);机器学习(ML)是引擎:提供动力方法(如燃油发动机);深度学习(DL)是涡轮增压:提升引擎性能(如处理复杂路况)。三者协同驱动技术发展,如同车辆需要…...
电子电器架构 --- 智能座舱的定义
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
JavaScript Map 对象深度解剖
JavaScript Map 对象深度解剖 一、Map 核心特性 1.1 什么是 Map? 通俗解释: Map 就像是一个“超级版对象”,它用更灵活的方式存储键值对。举个生活例子: 普通对象(Object)像一本传统电话簿,…...
zlm启用webrtc交叉编译指南
zlm启用webrtc交叉编译指南 一、交叉编译openssl 下载openssl-1.1.1k版本,其他版本可能会有问题 $ wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz $ tar -xvzf openssl-1.1.1k.tar.gz $ cd openssl-1.1.1k $ ./config no-asm shared --openssld…...
树莓派超全系列教程文档--(23)内核参数
内核参数 内核命令行 (cmdline.txt)命令行选项标准条目设置KMS显示模式 其他条目 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 内核命令行 (cmdline.txt) Linux 内核在启动过程中接受一系列命令行参数。在 Raspberry Pi 上,该命令…...
机器学习 从入门到精通 day_05
1. 线性回归 前面介绍了很多分类算法,分类的目标变量是标称型数据,回归是对连续型的数据做出预测。 标称型数据(Nominal Data)是统计学和数据分析中的一种数据类型,它用于分类或标记不同的类别或组别,数据点之间并没有…...
读者、写者问题优化
#include <stdio.h> #include <time.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define NUM_READERS 5 #define NUM_WRITERS 5 // 定义信号量和全局变量 sem_t sdata, srcount; int rea…...
DeepSeek-V3与DeepSeek-R1架构原理及应用对比分析
DeepSeek-V3与DeepSeek-R1架构原理及应用对比分析 DeepSeek作为中国人工智能领域的重要参与者,推出了V3和R1两款大模型,它们在架构设计和应用场景上各有侧重。本文将深入分析这两款模型在架构原理上的核心差异,并探讨它们如何分别应对复杂推…...
OpenCV图像增强实战教程:从理论到代码实现
OpenCV图像增强实战教程:从理论到代码实现 🔥🚀 📚 想要掌握图像增强的核心技术?本文手把手教你使用OpenCV实现多种图像增强技术,从基础的线性变换到高级的频域滤波,全方位提升你的图像处理能力…...
一文介绍关于多模态的基础知识 !!
文章目录 前言 一、机器学习 二、深度学习 三、应用领域 前言 多模态不再局限于单一类型的数据处理,它融合图像、文本和音频等多种信息源。其基础知识涵盖机器学习、深度学习及其在多模态领域的应用。机器学习部分包含分类、回归、聚类和降维等四类算法;…...
mysql DQL
一.基本查询 1.查询多个字段 2.查看所有字段 3.设置别名 4.去除重复记录 二.条件查询 1.大于小于等于 2.查询 身份证为空的 没有所以没有记录 3.在15到20这个区间范围内 4.or/in 或者 4.like 匹配 (_匹配单个字符 %匹配多个字符) 查询员工信…...
Android Studio 项目文件夹结构详解
文章目录 一、项目视图概览1. Android 视图(简化视图)2. Project 视图(完整物理结构) 二、核心目录详解1. 项目根目录文件2. app 模块目录(主模块)2.1 manifests/2.2 java/2.3 res/ - 资源目录2.4 assets/2…...
Linux系统常见磁盘扩容操作(Common Disk Expansion Operations in Linux Systems)
Linux系统常见磁盘扩容操作 目录说明 一、准备工作:获取目标磁盘信息 (1)确认分区表格式和文件系统 二、扩容已有MBR分区 (1)分区后扩容 ext为例 xfs为例 三、扩容已有GPT分区 (1)分区…...
【UE5 C++】“ProceduralMeshComponent”的使用记录
效果 如下所示,通过“ProceduralMeshComponent”创建了一个自定义形状的Mesh,并且该Mesh包含碰撞信息,然后2s后更新Mesh形状。 步骤 1. 在“xxx.Build.cs”中引入“ProceduralMeshComponent”模块 2. 新建一个Actor类,这里命名为…...
源代码加密之零日攻击
# SDC沙盒:有效防御零日攻击的多层防护体系 在当今复杂多变的网络安全环境中,零日攻击已成为企业面临的重大威胁之一。零日攻击利用尚未被公众发现或尚未被软件供应商修复的漏洞进行攻击,具有极高的隐蔽性和破坏性。SDC沙盒作为一种先进的数…...
Vue2 集成VTK.js 并显示3D影像
Vue2 集成VTK.js 并显示3D影像(核心代码) 作者:coder_fang vtk.js目前官网只有vue3的示例,对于已有vue2系统的集成,需要使用指定版本的vtk,itk等库并修改部分配置即可。 需要的主要库和版本: vue:2.3.4; vtk-v32.9.0.min.js,itk-wasm.min.…...
本地git操作
一、初始化与基础操作 1. 初始化仓库 git init # 当前目录新建仓库 git init <目录名> # 指定目录初始化 2. 查看状态 git status # 显示工作区和暂存区状态 git status -s # 简洁版状…...
AI的出现,是否能替代IT从业者?
*AI在IT领域中的应用已成趋势,IT 从业者们站在这风暴之眼,面临着一个尖锐问题:AI 是否会成为 “职业终结者”?有人担忧 AI 将取代 IT 行业的大部分工作,也有人坚信 IT 从业者的专业技能与创新思维无可替代。那么&#…...
3、组件:魔法傀儡的诞生——React 19 组件化开发全解析
一、开篇:魔法傀儡的觉醒 "每个React组件都像一具魔法傀儡,"邓布利多校长挥动魔杖,空中浮现出闪烁的代码字符,"它们能自主思考、协同工作,甚至能跨越时空(服务器与客户端)执行任…...
Vue 解决 Error: please transfer a valid prop path to form item!
在 Vue.js 中使用表单验证库(如 VeeValidate 或 Element UI 的表单组件时),遇到错误信息 "please transfer a valid prop path to form item!" 通常指的是在表单项的属性绑定中,路径(prop path)不…...
day29 第八章 贪心算法 part03
134. 加油站 “可以换一个思路,首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。 每个加油站的剩余量rest[i]为gas[i] - cost[i]。 i从0开始累加rest[i],和记为curSum…...
贪心算法(19)(java)重构字符串
题目:给定一个字符串 s ,检查是否能重新排布其中的字母,使得两相邻的字符不同。 返回 s 的任意可能的重新排列。若不可行,返回空字符串 "" 。 示例 1: 输入: s "aab" 输出: "aba"示例 2: 输入:…...
Linux下C语言与OpenGL游戏开发指南
1. 为什么选择 Linux C OpenGL? 跨平台兼容性:OpenGL 是跨平台的图形 API,编写的代码稍作修改即可在 Windows/macOS 上运行。 性能控制:C 语言提供底层内存管理和硬件访问能力,适合高性能游戏开发。 开源生态&…...
深入 Java 正则表达式源码:透视 Matcher.group(int) 的分组提取机制
在 Java 中,正则表达式无疑是文本处理的重要工具。而 Matcher.group(int group) 是其中非常关键的一个方法,它用于提取正则中的分组内容。今天我们不仅通过一个例子来看它的使用方法,还会结合底层源码,深入理解它背后的机制。 实…...
解决 Spring Boot 启动报错:数据源配置引发的启动失败
启动项目时,控制台输出了如下错误信息: Error starting ApplicationContext. To display the condition evaluation report re-run your application with debug enabled. 2025-04-14 21:13:33.005 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporte…...
【深度学习的骨架与脉搏】语义分割的卷积神经网络·U-Net
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 …...
ELK+Filebeat 深度部署指南与实战测试全解析
一、介绍 ELK: ELasticsearch ,Logstash,Kibana三大开源框架首字母简写,市面上也被称为Elastic Stack。 Elasticsearch 是一个基于 Lucene 的分布式搜索平台框架,通过 Restful 方式进行交互,具备近实时搜索能力。像百度、Google 这类大数据全…...
Java设计模式之中介者模式:从入门到架构级实践
一、什么是中介者模式? 中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过引入一个中介对象来封装多个对象之间的交互关系。这种模式将原本复杂的网状通信结构转换为星型结构,类似于现实生活中的机…...
L2TP通道基础实验
目录 实验拓扑: 一、需求配置LAC设置: 界面设置: 编辑LNS设置: 建立静态路由:编辑 策略配置: 二、测试 通讯测试: 实验拓扑: 一、需求配置 LAC设置: [LAC]l2…...
关于字节跳动旗下的豆包(DouBao)软件的详解、核心功能以及与同类产品的对比分析
以下是关于豆包(DouBao)软件的详解、核心功能以及与同类产品的对比分析: 一、豆包(DouBao)详解 豆包是字节跳动推出的一款多功能人工智能助手,主打“智能助手场景化工具”结合,覆盖日常生活、…...
如何在本地修改 Git 项目的远程仓库地址
✅ 场景说明 你当前的 Git 项目地址是: http://192.168.0.16/xxx.git你希望把它改成: http://192.168.0.22:8099/xxx.git🧩 操作步骤 步骤 ①:进入项目所在目录 你已经在正确路径下了: cd C:\Develop\xxx确认这个…...