当前位置: 首页 > news >正文

深入理解JNI、安全点与循环优化:构建高健壮性Java应用

🔥🔥🔥来都来了 ~ 先赞后看 效果翻倍哦 ~ 👍👍👍

引言

在Java开发者的工具箱中,有一些看似神秘却极其重要的底层概念。你是否曾听说过在循环中插入Thread.sleep(0)可以"唤醒"GC?或者疑惑为什么一个简单的循环计数器类型选择会影响整个应用的稳定性?本文将深入剖析这些现象背后的核心机制:JNI、安全点以及JIT编译器的优化策略。通过理解这些底层原理,您将能够编写出更加健壮、稳定和高性能的Java应用程序。

一、JNI:连接Java与本地世界的桥梁

1.1 JNI的核心作用

JNI(Java Native Interface)是Java平台提供的一套标准编程接口,它建立了Java虚拟机(JVM)与本地代码(如C、C++)之间的通信桥梁。当Java需要突破虚拟机限制,直接与操作系统底层或特定硬件交互时,JNI发挥着不可替代的作用。

1.2 JNI的工作机制

// Java层声明native方法
public class NativeOperations {public native void performSystemCall();static {System.loadLibrary("systemOperations");}
}

对应的本地代码实现:

#include <jni.h>
#include "NativeOperations.h"JNIEXPORT void JNICALL Java_NativeOperations_performSystemCall(JNIEnv *env, jobject obj) {// 执行系统调用或硬件操作system_specific_operation();
}

1.3 JNI的特殊执行状态

当线程执行JNI代码时,它暂时脱离了JVM的完全控制,处于一种"非托管"状态。这种状态有两个重要特点:

  • JVM无法准确感知线程的栈和寄存器状态
  • 线程在执行本地代码期间不会响应JVM的安全点请求

二、安全点:JVM的全局协调机制

2.1 安全点的定义与重要性

安全点(Safepoint)是Java代码中一些特定位置,在这些位置上线程的状态是已知、一致且可安全修改的。JVM在进行垃圾回收(GC)、代码反优化、线程栈采集等全局操作时,必须等待所有Java线程到达安全点。

2.2 安全点的协作机制

JVM采用一种优雅的协作式方法来实现安全点:

  1. 设置安全点请求标志:当需要全局操作时,JVM设置一个全局标志
  2. 主动轮询检查:各线程在执行过程中定期检查这个标志
  3. 安全挂起:检测到请求的线程在下一个安全点挂起自己
  4. 执行全局操作:所有线程停止后,JVM执行所需操作
  5. 恢复执行:操作完成后,线程继续执行

2.3 常见的安全点位置

  • 方法调用和返回点
  • 循环回跳边界
  • 异常抛出点
  • JNI调用返回点(特别重要)

三、Thread.sleep(0)的奥秘:安全点的触发机制

3.1 长时间循环的安全点问题

考虑以下常见的性能优化模式:

public long processData(byte[] data) {long result = 0;for (int i = 0; i < data.length; i++) {// 紧循环:简单操作,无方法调用result = (result << 5) - result + data[i];}return result;
}

这种"紧循环"(Tight Loop)在没有函数调用的情况下,可能会阻止线程进入安全点。

3.2 Thread.sleep(0)的安全点机制

Thread.sleep(0)的特殊性在于:

  1. 它是一个JNI方法,涉及Java到本地代码的转换
  2. 从本地代码返回Java代码时是一个明确的安全点
  3. 即使休眠时间为0,也会完成完整的JNI调用流程
public long processDataWithSafepoint(byte[] data) {long result = 0;for (int i = 0; i < data.length; i++) {result = (result << 5) - result + data[i];// 定期提供安全点机会if (i % 10000 == 0) {try {Thread.sleep(0); // JNI调用,创建安全点机会} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}return result;
}

3.3 为什么看似"唤醒"GC?

实际上,GC进程一直在等待所有线程到达安全点。长时间运行的循环线程推迟了这一过程。当该线程调用Thread.sleep(0)并在返回时进入安全点,它就解除了对GC的阻塞,使得GC得以继续。

四、深入循环优化:int与long的关键区别

4.1 可数循环 vs. 不可数循环

JVM的JIT编译器对循环进行优化时,有一个关键分类:可数循环(Counted Loop)和不可数循环(Uncounted Loop)。

可数循环的特征:

  • 使用整数类型(int, short, byte, char)作为计数器
  • 有固定的循环边界
  • 固定的步长(通常为1)

不可数循环的特征:

  • 使用long作为计数器
  • 循环边界变化
  • 使用迭代器等复杂模式

4.2 int循环的安全点问题

对于int类型的循环,JIT编译器会进行激进优化:

// JIT很可能将其优化为可数循环,移除循环体内的安全点轮询
for (int i = 0; i < 1_000_000_000; i++) {// 简单操作,没有方法调用data[i] = (byte) (data[i] * factor);
}
// 安全点轮询被放置在这里(循环出口)

风险: 如果循环迭代次数极多(上亿次)且每次迭代很快,线程将长时间无法进入安全点,阻塞GC和其他全局操作。

4.3 long循环的安全点行为

对于long类型的循环,JIT编译器采取保守策略:

// JIT通常会保留循环体内的安全点轮询
for (long i = 0; i < 1_000_000_000L; i++) {// 即使没有方法调用,JIT也会插入安全点检查result += array[(int) (i % array.length)];
}

优势: 线程会定期检查安全点请求,不会长时间阻塞GC。

4.4 int与long循环的对比总结

特性 int 循环 long 循环
JIT分类 通常为可数循环 通常为不可数循环
优化策略 激进优化,移除循环体内安全点 保守优化,保留循环体内安全点
安全点位置 主要在循环退出处 循环体内定期检查
GC阻塞风险 (长紧循环易阻塞GC) (GC延迟时间短)
原始性能 更高(无安全点检查开销) 稍低(有安全点检查开销)
适用场景 迭代次数少或操作复杂的循环 迭代次数极多的紧循环

五、实战应用:编写健壮且高效的代码

5.1 正确认识底层优化

首先需要明确:不应滥用Thread.sleep(0)或盲目更改循环类型。这些是理解机制后的诊断工具,而非日常编程模式。

5.2 识别和修复安全点敏感代码

不良模式(安全点敏感):

// 可能被优化为无安全点的可数循环
for (int i = 0; i < VERY_LARGE_NUMBER; i++) {// 紧循环操作state = (state * 1664525L + 1013904223L) & 0xFFFFFFFFL;
}

改进方案1:定期插入安全点机会

for (int i = 0; i < VERY_LARGE_NUMBER; i++) {state = (state * 1664525L + 1013904223L) & 0xFFFFFFFFL;// 每处理一定迭代后提供安全点机会if ((i & 0x3FFF) == 0) { // 每16384次迭代allowSafepoint();}
}private void allowSafepoint() {// 空方法或yield调用Thread.yield();
}

改进方案2:使用分批处理

int batchSize = 10000;
for (int batch = 0; batch < TOTAL_BATCHES; batch++) {processBatch(batch * batchSize, Math.min((batch + 1) * batchSize, totalItems));// 每批处理完自然产生安全点(方法返回)
}private void processBatch(int start, int end) {for (int i = start; i < end; i++) {// 处理逻辑}
}

5.3 高可靠性系统的安全点策略

对于金融、实时系统等对停顿敏感的场景:

  1. 代码审查:检查是否存在长时间运行的紧循环
  2. 性能测试:在高负载下监控GC停顿时间
  3. 安全点注入:在关键循环中主动管理安全点
  4. 监控告警:设置GC停顿时间阈值告警

5.4 综合选择策略

  1. 首选int循环:对于大多数场景,int循环性能更好
  2. 主动管理安全点:在长循环中定期插入安全点机会
  3. 谨慎使用long循环:只有在确实需要极大计数范围时使用
  4. 基准测试验证:通过实际测试验证不同选择的影响
// 综合最佳实践示例
public void robustProcessing(int[] data) {final int safepointInterval = 10000; // 安全点间隔for (int i = 0; i < data.length; i++) {// 业务逻辑data[i] = transform(data[i]);// 主动管理安全点if (i % safepointInterval == 0) {provideSafepointOpportunity();}}
}private void provideSafepointOpportunity() {// 空方法调用,引入安全点// 或者使用 Thread.yield()
}

六、总结与最佳实践

通过本文的分析,我们可以得出以下结论:

  1. JNI是Java与本地代码的桥梁,JNI调用返回点是重要的安全点位置
  2. 安全点是JVM的协调机制,确保全局操作时线程状态的一致性
  3. Thread.sleep(0)通过JNI机制强制线程进入安全点,解除GC阻塞
  4. int循环可能被优化为无安全点的可数循环,而long循环通常更安全
  5. 最可靠的方案是主动管理安全点,而非依赖类型选择或hack技巧

最终建议:

  • 理解机制而非死记规则
  • 编写JVM友好的代码,而非试图欺骗JVM
  • 在需要长时间运行的循环中主动引入安全点机会
  • 通过监控和测试验证系统行为
  • 优先使用标准库和框架提供的并发工具

通过深入理解JVM内部机制,我们可以编写出更加健壮、稳定和高性能的Java应用程序,能够在各种极端条件下保持可靠的性能表现。

相关文章:

深入理解JNI、安全点与循环优化:构建高健壮性Java应用

🔥🔥🔥来都来了 ~ 先赞后看 效果翻倍哦 ~ 👍👍👍 引言 在Java开发者的工具箱中,有一些看似神秘却极其重要的底层概念。你是否曾听说过在循环中插入Thread.sleep(0)可以"唤醒"GC?或者疑惑为什么一个简单的循环计数器类型选择会影响整个应用的稳定性?本…...

英语_阅读_fascinating facts about water_待读

Did you know these fascinating facts about water? They might change the way you think about every drop!你知道这些关于水的奇妙事实吗?它们可能会改变你对每一滴水的看法! Scientists have discovered something incredible - the amount of water on the Earth toda…...

AI自动化测试全攻略:从AI 自动化测试实战到AI 智能测试平台开发!

最新一期 AI + 全栈测试开发训练营震撼来袭,课程内容全面升级,月薪轻松对标 30k + !今日开放 5 个特价名额,零基础小白与测试老司机皆可在此找到专属学习路径,涵盖从AI 自动化测试实战到AI 智能测试平台开发等前沿内容,覆盖 AI 时代测试开发核心能力,帮你构建完整知识体…...

LG9691

考虑 dp。设 \(f_i\) 表示到位置 \(i\) 所需的最小花费,且第 \(i\) 个位置必选,现在要找上一个决策点 \(j\),这个点应该要在此前所有区间的左端点的后面,才能保证这些区间能被覆盖(即确保至少一个在之前每个区间内),则 \(j\) 应满足 \(\max_{r_k<i}l_k \le j < i\…...

即时通讯小程序 - 实践

即时通讯小程序 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 1…...

PHP serialize 序列化完全指南

PHP serialize 序列化完全指南 介绍 如果你和我一样,第一次在 PHP 中看到序列化字符串时会觉得很困惑。我当时在做一个 Laravel 项目,想搞清楚将任务推送到队列时到底发生了什么。我发现一些数据被序列化了,但不知道为什么以及怎么工作的。不过在我花时间研究序列化后,发现…...

CF2112D

注意到一条边无论方向如何,都能使两端的某一个点到达另一个点,即至少有 \(n-1\) 对。如果只需要 \(n-1\) 对,那么只需要在每一条链上相邻的边方向相反即可。对于剩下的一对,我们可以找到一个度数为 \(2\) 的点,并把连接的两条边由反向改为同向,那么附近的三个点产生的对数…...

CF2112C

设 Alice 取的位置为 \(i,j,k\) 且 \(i<j<k\),则 Bob 的最优策略有两种:取 \(n\) 或 \(k\)。为了使 Alice 必胜,必须同时满足 \(a_i+a_j+a_k>a_n,a_i+a_j>a_k\)。枚举 \(i,j\),显然满足两个条件的 \(k\) 都是一段连续的区间。分别二分算出两个区间的边界,那么…...

CF342C

显然,每一层恰好能放下两个球(事实上这也是最优的方案),那么下面一共可以放 \(\lfloor \frac{h}{r} \rfloor \times 2\) 个球,剩余 \(h - \lfloor \frac{h}{r} \rfloor \times r+r\) 的高度,记 \(h=h-\lfloor \frac{h}{r} \rfloor\times r\) 为立方体部分剩余高度。最上面…...

ICPC/XCPC 做题记录

[SNCPC2019] Unrooted Trie 发现不满足题意的情况就是一个节点到多个子节点的边的字母相同,那么合法当且仅当每个节点到子节点的字母互不相同。那么可以统计每个节点连接的字母数量,并运用类似换根 dp 的思路,快速更新这个数量并实时维护符合条件的点的数量即可。时间复杂度…...

LG9648

发现不满足题意的情况就是一个节点到多个子节点的边的字母相同,那么合法当且仅当每个节点到子节点的字母互不相同。那么可以统计每个节点连接的字母数量,并运用类似换根 dp 的思路,快速更新这个数量并实时维护符合条件的点的数量即可。时间复杂度 \(O(nA)\),其中 \(A=26\) …...

LG5689

设 \(f_u\) 表示以 \(u\) 为根的子树构成不同多叉堆的方案数。显然最小的 \(0\) 应该分配给 \(u\),剩下的分给子节点 \(v_1,v_2,\cdots,v_k\),根据乘法原理,有 \[f_u=\prod_{i=1}^k \binom{siz_u-1-\sum_{j=1}^{i-1}siz_{v_j}}{siz_{v_i}}f_{v_i} \]将组合数和 \(f\) 分开,…...

近五年 CSP NOIP 补题记录

2025.6.18 NOIP2024 T4 树上查询 To be updated. Submission CSP-S2019 江西 T3 网格图 To be updated. Submission 2025.6.19 CSP-S2019 D1T2 括号树 To be updated. Submission CSP-S2021 T3 回文 To be updated. Submission CSP-S2019 江西 T1 日期 To be updated. Submissi…...

CF2111C

显然,操作的方式一定是一段数字相等的极长连续段向左右拓展(包括长度为 \(1\) 的段)。故只需扫一遍并维护每段的值和长度即可,并更新答案。时间复杂度 \(O(\sum n)\)。 #include<iostream> #include<cstdio> #define int long long #define N 500010 using nam…...

唐人日记

唐注意看函数返回值!!!!!!!...

CF2111B

首先最大的 \(f_n\) 必须放的下,即 \(f_n \le \min(w,l,h)\)。此外,\(f_{n-1}\) 紧贴在 \(f_n\) 的一个面上,故要 \(f_n+f_{n-1} \le \max(w,l,h)\)。剩下的第 \(i\) 个正方体由于满足 \(f_{i+2}=f_{i}+f_{i+1}\),故只需与第 \(i+1,i+2\) 个正方体共用一条棱即可,且一定不…...

ABC394F

在同一棵树中,选择任意一个点作为根,效果都是相同的。不妨以 \(1\) 为树根,考虑树上 dp,记 \(f_u\) 为以 \(u\) 为根的子树的点数最大值。注意到根节点度数可为 \(1\) 可为 \(4\),而非根非叶子节点度数必须为 \(4\)。由此可以分两类转移。假设子树中 \(u\) 度数为 \(1\),…...

LG11793

注意到 \(N \times M \le 2\times 10^7\),因此不难得到一个 dp 做法。设 \(f_i\) 表示把前 \(i\) 个橙子装进箱子内的最小成本,则不难得到以下转移式: \[f_i=\min_{i-j\le m,0 \le j < i} f_j+k+ ( i - j ) \times ( \max_{j < k \le i} a_k - \min_{j < k \le i} …...

ABC394G

题目要求最小化爬楼梯的次数,那么我们就要让楼层的变化尽量小,即沿线楼房高度越高越好。不难发现影响答案的是路线中的楼房高度的最小值,则需要最大化最小值。那么就不难用 Kruskal 重构树做了。对每个点进行唯一编号,相邻的点建边权为较小的的楼房高度的双向边。剩下的就是…...

MX 炼石 2026 NOIP #5

qwq2026 --【炼石计划 NOIP】-- 第五套 链接:link 题解:link 时间:4h (2025.09.11 14:00~18:00) 题目数:4 难度:A B C D估分:[40,60] + 80 + 32 + ? = [152,172]+? 得分:40 + 60 + 32 + 10 = 142 Rank:场祭补题天依宝宝可爱!...

0126_状态模式(State)

状态模式(State) 意图 允许对象在内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 UML 图优点行为与状态绑定:将特定状态下的行为局部化到对应的状态类中 消除条件判断:避免了大量的if-else状态判断逻辑 状态转换明确:使状态转换流程更加清晰和可管理 易于扩展:…...

Visual Studio 2026 预览体验版现已发布,一起来看看带来哪些新功能!

前言 2025 年 9 月 9 日微软 Visual Studio 团队正式推出了 Visual Studio 2026 预览体验版(Visual Studio 2026 Insiders),此次发布标志着 Visual Studio 迎来一个全新的时代,它将人工智能深度集成到平台中,基础功能更强大,性能也得到进一步提升。 下载 Visual Studio 2…...

基于RK3568/RK3576/RK3588/全志H3/飞腾芯片/国产UOS等/国标GB28181监控系统

一、前言说明 之前从最底层协议通信把gb28181实现了一遍,没有用到exosip或者pjsip等任何第三方库,通过熟读gb28181国标文档几百页,看了一遍又一遍,根据对应的官方文档,一行行代码底层实现,其实就是网络通信,可选tcp或者udp,和http都是同类型的协议,有消息头和消息体,…...

Go语言读写锁(RWMutex)底层原理详解

Go语言读写锁(RWMutex)底层原理详解 概述 Go语言的sync.RWMutex是一种读写锁,允许多个读操作同时进行,但写操作是互斥的。这种锁机制在读多写少的场景下能显著提高并发性能。底层通过互斥锁和原子计数器实现复杂的并发控制。 核心数据结构 type rwmutex struct {rLock m…...

【GitHub每日速递】无需提示词!Nano Bananary香蕉超市:AI绘画玩法多到停不下来

原文:【GitHub每日速递】无需提示词!Nano Bananary香蕉超市:AI绘画玩法多到停不下来 AutoGPT来袭!搭建、部署、运行AI智能体全攻略揭秘 AutoGPT 是一个基于自主任务执行的AI代理工具。简单讲,它能让AI自动拆解目标并执行一系列操作来完成任务,无需持续人工干预。适用人群…...

小题狂练 (J)

solset-J\[\newcommand{\diag}{\operatorname{diag}} \]目录 目录[AGC070B] Odd Namori[JOI Open 2025] 冒泡排序机 / Bubble Sort Machine[AGC039F] Min Product Sum[AGC070B] Odd NamoriMatrix-Tree 定理:给一张带权有向图 \(G\),求 \(G\) 所有以 \(1\) 为根的内向生成树边…...

Drift数据库开发实战:类型安全的SQLite解决方案

Drift数据库开发实战:类型安全的SQLite解决方案本文基于BeeCount(蜜蜂记账)项目的实际开发经验,深入探讨如何使用Drift构建类型安全、高性能的Flutter数据库层。项目背景 BeeCount(蜜蜂记账)是一款开源、简洁、无广告的个人记账应用。所有财务数据完全由用户掌控,支持本地存…...

DELPHI FireDAC连接EXCEL文件

重要提示: xls后缀的文件与xlsx后缀的文件,连接方法不一样. 可以使用代码来实现:FDConnection1.Connected := false;FDConnection1.Params.Clear;FDConnection1.DriverName := ODBC;FDConnection1.Params.Values[DriverID] := ODBC;FDConnection1.Params.Values[ODBCDriver] :=…...

读人形机器人09教育行业

读人形机器人09教育行业1. 教育行业 1.1. 教育是社会进步的基石,是指引后代走向启蒙与创新的明灯 1.2. 人形机器人通过使学习互动化、沉浸化、趣味化,革新了教学方法 1.3. 借助技术创造兼具教育性与吸引力的体验,培养学生成为主动学习者和批判性思考者 2. 个性化学习体验 2.…...

PHP判断字符串是否包含中文

function hasChinese($str) { return preg_match(/[\x{4e00}-\x{9fa5}]/u, $str);} // 使用示例$string = "Hello 你好";if (hasChinese($string)) { echo "字符串包含中文";} else { echo "字符串不包含中文";}每天进步一点点...

当我们红尘作伴,活得潇潇洒洒

为了证明我是真的睡不着而非摆到凌晨三点,先来一点正经东西。平面等腰直角三角形加,查询矩形和。经典问题,但我刚刚才会。考虑矩形加矩形和是咋做的,通过一堆拆拆拆把 4-side 变成 2-side,然后扫描线扫掉一维,数据结构维护另一维。那等腰直角三角形肯定也要拆拆拆。认为下…...

诡异的mysql8的问题

同样是使用 mysql8的镜像 在其他三台服务器上能正常执行druid:initial-size: 5min-idle: 5max-active: 20max-wait: 60000# 调整为 1800000 毫秒 (30 分钟),需大于数据库 wait_timeoutmin-evictable-idle-time-millis: 1800000# 调整检查间隔为 120000 毫秒 (2 分钟)time-betwe…...

二叉树理论

满二叉树:只有度数为0或者2的节点,并且度数为0的节点在同一层;完全二叉树 除了底层节点可能没填满以外其他都填满了,并且最下面一层的节点都集中在该层最左边的若干位置。 之前我们刚刚讲过优先级队列其实是一个堆,堆就是一棵完全二叉树,同时保证父子节点的顺序关系。 二…...

支付中心的熔断降级要怎么做

下面我会把支付中心在流量骤增 / 下游通道故障时的熔断与降级策略拆成(1)原则与常见策略,(2) 业务级降级/路由策略,(3) 具体落地组件(行业实践与参考),以及(4)可直接落地的 Java 示例(使用 Resilience4j + fallback + 速率限制 + 隔离)。 1) 基本原则(5 条行业共识…...

协议版iM蓝号检测,批量筛选iMessages数据,无痕检测是否开启iMessage服务

一、实现iMessage数据检测的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2…...

栈和队列总结

栈和队列理论C++中stack,queue 是容器么? 我们使用的stack,queue是属于那个版本的STL? 我们使用的STL中stack,queue是如何实现的? stack,queue 提供迭代器来遍历空间么?stack和queue是STL中的容器适配器,不是类似list,vector那样的容器; 容器适配器本质上是基于底层真…...

工业互联网认知实训台-一句话介绍

工业互联网认知实训台主要由传感器、PLC控制器、工业以太网设备、人机界面(HMI)、步进电机和伺服电机等设备组成。步进电机:通过电脉冲信号控制电机每步旋转固定角度,结构简单、成本低,适合精确定位,但效率较低且可能失步。实训台中使用PLC(如1212C系列)通过脉冲信号控…...

1

<meta name="description" content="加载中... 如白屏请[ 点击刷新页面 ]"> <meta property="og:description" content="加载中... 如白屏请[ 点击刷新页面 ]"> <meta http-equiv="Cache-Control" content=&…...

湾区杯 SilentMiner WP

攻击者的ip地址查看文件 /var/log/btmp 发现短时间内大量登录,可确定攻击者 ip 为 192.168.145.131 lastb -f /var/log/btmp192.168.145.131攻击者共进行多少次ssh口令爆破失败?根据 /var/log/btmp 文件计数 lastb -f btmp | grep 192.168.145.131 | wc -l也可以在 /var/log/…...

Python-课后题题目-1.1编程世界初探

1.1编程世界初探(单选题) 1.程序设计语言的主要目的是什么? A让计算机变得更便宜 B使人类能够以高效,清晰,结构化的方式表达计算机逻辑和数据操作 C取代数学和逻辑学 D仅用于编写游戏程序 2.机器语言是由什么组成的? A十进制数字 B英文字母 C二进制代码 D特殊符号 3.汇…...

Python-课后题题目-1.2初识python语言

1.2初识python语言(单选题)Python语言最初由谁创建? A.林纳斯托瓦兹 B.吉多范罗苏姆 C.詹姆斯高斯林 D.布雷丹艾奇 Python 0.9.0版本首次发布于哪一年? A.1989 B.1991 C.1994 D.2000 Python 1.0版本引入了以下哪项特性? A.异步编程 B.类型注释 C.循环和异常处理 D.垃圾回收…...

node和npm相关的记录

1 npm install --loglevel verbose 安装的啰嗦模式会打印日志2 3 npm config get registry 查看镜像源信息。 淘宝的镜像源已经关闭了。4 5 #windwos可以安装一个nvm,可以切换node和npm的版本。6 nvm下载地址 https://github.com/coreybutler/nvm-windows/releases7 8 nvm in…...

在Spring boot 中使用@master 设置主从数据库

基础配置 application.ymlspring:  datasource:     master:       url: jdbc:mysql://localhost:3306/master_db       username: root       password: 123456       driver-class-name: com.mysql.cj.jdbc.Driver …...

设计模式-装饰器模式 - MaC

装饰器模式是一种结构型设计模式,它允许在不修改原有对象结构的情况下,动态地给对象添加新的功能。装饰器模式通过创建一个包装对象(装饰器)来包裹真实的对象,从而在运行时扩展对象的功能。 装饰器模式包含以下角色:组件(Component):定义一个对象接口,可以给这些对象动…...

【API接口】最新可用河马短剧接口

最新可用红果短剧接口,支持短剧搜索、短剧详情解析、短剧播放链接解析功能,助您快速构建您的专属短剧客户端 使用之前您需要先去注册下key 申请地址: https://www.52api.cn 接口地址:https://www.52api.cn/api/hm_duanju 返回格式:application/json 请求方式:GET/POST 请…...

第 16 章反射(reflection)

第 16 章反射(reflection)第 16 章反射(reflection) 16.1 一个需求引出反射 16.1.1 请看下面的问题根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi classfullpath=com.hspedu.Cat method=hi思考:使用现有技术,你能做的吗?这样的需求在学习框架时特别多,即通…...

自我介绍+软工5问

| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/join?id=CfDJ8G33EJ5dWE5OhU_7yPrjq1_EG2G2ljnyYNdPWrrB61TEPdvbX8B-02_mm2lbvSH0zHF0AFJBdSQazCWQtYhdASVnPbQZ7mm4BuFr16ksfoeASRJAr16ktj02s3Qx3JGS33oIuJz021Uout0lNo8pyB8 …...

电容器+动生电动势+自由落体模型

电容器电容为 \(C\),磁感应强度为 \(B\),导体棒长度为 \(L\),质量为 \(m\),重力加速度 \(g\)。 设关于时间 \(t\) 的函数 \(E(t),U(t),Q(t),I(t),v(t),a(t)\)。 \[\begin{cases} E(t)=BLv(t)\\ U(t)=E(t)\\ Q(t)=CU(t)\\ I(t)=Q(t)\\ F(t)=mg-BLI(t)\\ a(t)=v(t)=\dfrac{F(…...

引用(reference)

1.概念 引用是C++对C的一个重要扩充,引用表示给变量起个别名;//类似于linux中的硬链接文件 2.定义引用 数据类型 &引用名 = 引用的目标; 如: int &b = a; & 在C++有三种作用: (1)定义引用时,是引用标识符,表示定义的是一个引用 (2)按位与 & (3)其他任何场…...

设计模式-组合模式 - MaC

什么是组合模式? 组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示"部分-整体"的层次关系。组合模式使得客户端对单个对象和组合对象的使用具有一致性。 组合模式包含以下角色:组件(Component):声明组合中对象的接口,适当情况下实现所有类共有…...