- 博客(535)
- 资源 (4)
- 收藏
- 关注
原创 深入解析 I/O 模型:原理、区别与 Java 实践
BIO:简单但性能差,适合低频场景。非阻塞 I/O:需主动轮询,效率低下,实际较少直接使用。I/O 多路复用:高并发场景的黄金标准,Java NIO 的核心实现。AIO:理论最优,但受限于操作系统和编程复杂度。技术选型建议大多数场景下,I/O 多路复用(NIO)是最佳选择。若需极致性能且系统支持,可尝试异步 I/O(如 Linuxio_uring传统 BIO 仅适用于原型开发或低并发场景。
2025-05-13 22:00:30
825
1
转载 简单说一下阻塞IO、非阻塞IO、IO复用的区别
在《Unix网络编程》一书中提到了五种IO模型,分别是:阻塞IO、非阻塞IO、IO复用、信号驱动IO以及异步IO。本篇文章主要介绍IO的基本概念以及阻塞IO、非阻塞IO、IO复用三种模型,供大家参考学习。对于计算机而言,任何涉及到计算机核心(CPU和内存)与其他设备间的数据转移的过程就是IO。IO设备:比如我们最常见的打印机、鼠标、键盘。对IO设备的数据读写。阻塞IO模型会阻塞较长时间;非阻塞IO在等待数据报的过程中,进程并没有阻塞,它可以做其他的事情;
2025-05-13 21:49:52
17
原创 Java并发之流水线模式以及CompletableFuture实战
流水线模式是一种高效的并发处理模型,适用于需要分阶段处理的任务场景。通过合理设计线程池规模和使用等工具,可以显著提升代码的可读性和性能。避免回调地狱:通过链式调用或简化代码。合理配置线程池:根据任务类型选择合适的线程数和队列策略。异常处理:确保每个阶段的异常能够被捕获和处理。任务解耦:通过模块化设计提高系统的可维护性。通过以上优化,流水线模式可以成为Java并发编程中的强大工具,帮助开发者构建高效、可靠的并发系统。
2025-05-09 11:45:57
634
原创 Java 显式锁与 Condition 的使用详解
Java 中的 ReentrantLock 和 Condition 提供了比 synchronized 更灵活的线程同步机制。ReentrantLock 支持可重入锁、超时等待和公平锁,而 Condition 则用于线程的等待和唤醒,替代了传统的 Object.wait() 和 Object.notify()。通过生产者-消费者模型的示例,展示了如何使用 ReentrantLock 和 Condition 实现线程协作。常见误区包括不加锁调用 Condition.await(),这会导致 IllegalMo
2025-05-08 20:56:15
959
原创 Java线程阻塞方法LockSupport.park()/Thread.sleep()/Object.wait()详解:原理、区别
适合底层同步工具开发,提供最灵活的线程控制。适合简单延时,但需注意锁的释放问题。是经典的线程通信工具,适合条件驱动的协作场景。也是基于wait实现)开发者需根据具体需求选择合适的方法,并结合 JVM 和操作系统特性,编写高效、健壮的并发程序。理解这些方法的底层机制,不仅能优化性能,还能避免常见的并发陷阱(如死锁、资源泄漏)。
2025-05-08 17:24:38
1009
原创 CAS、CAS自旋、CAS自旋锁、CLH锁与Java AQS:深入理解并发编程核心机制
CAS(Compare and Swap)是一种无锁(Lock-Free)的原子操作,用于在多线程环境下实现数据同步。CLH(Craig, Landin, Hagersten)锁是一种基于链表的队列锁,通过隐式队列管理线程,减少缓存一致性流量。基于CAS自旋实现的锁,线程在获取锁失败时不会阻塞,而是循环尝试。理解这些机制的原理与实现,是编写高效、健壮并发代码的关键。CAS自旋是指线程在CAS失败后循环重试,直到成功。)的核心框架,用于构建锁和同步器(如。AQS提供需子类实现的抽象方法(如。
2025-05-08 12:25:23
577
原创 Java捕获InterruptedException异常后,会自动清空中断状态
异常,然后输出捕获异常后的中断状态。由于 Java 会自动清除中断状态,所以输出的中断状态为。在上述代码中,子线程开始睡眠 5 秒,主线程睡眠 1 秒后中断子线程。异常时,线程的中断状态会被自动清除,这是 Java 处理线程中断的一种机制。,Java 会自动清除该线程的中断状态。异常一般是在一个线程处于等待(像。等方法)状态时被另一个线程调用。,此时线程可以重新响应中断。
2025-05-04 22:18:32
229
原创 Java获取classpath根路径的方式
上述几种方法在不同场景下有各自的优势,可根据具体需求来选择合适的方法。能获取类路径,该路径由多个路径组成,以分隔符分隔。分隔符将其分割成多个路径元素,最后输出这些元素。方法来获取类路径的根路径,最后输出其路径。方法来获取类路径的根路径,然后输出该路径。方法可用于获取类路径下资源的。时,就能得到类路径的根路径。在上述代码中,先获取当前类的。即可得到类路径的根路径。方法获取类路径,再使用。
2025-03-31 11:08:20
337
原创 Server-Sent Events(SSE)协议(实现ChatGPT聊天“打字机“效果)
SSE是一种基于HTTP的轻量级协议,允许服务器通过单个HTTP连接持续向客户端推送实时数据。它是HTML5标准的一部分,旨在为Web应用提供一种简单、高效的实时数据传输方式。SSE协议作为一种基于HTTP的轻量级实时数据推送协议,为Web应用提供了一种简单、高效的实时通信解决方案。它继承了HTTP协议的兼容性和简单性,同时解决了实时数据传输的需求。对于不需要双向通信的场景,SSE是比WebSocket更轻量、更易维护的选择。随着Web技术的不断发展,SSE协议在实时通知、流式输出等领域将继续发挥重要作用。
2025-03-30 11:18:02
855
原创 Struct2中自定义的Filter失效问题
Struts2 的拦截器(Interceptor)机制替代了传统 Filter 链的职责,因此核心 Filter 可能在处理完成后主动终止 Filter 链。:一旦匹配到 Action,直接处理并返回响应,无需后续 Filter 参与。:直接响应静态资源(如 JS、CSS),避免无关 Filter 执行。(即请求匹配到一个 Struts2 Action),则直接调用。路径),则直接处理并返回响应,同样终止 Filter 链。,导致后续 Filter 链终止。若请求是静态资源(如配置的。
2025-03-26 15:43:44
274
原创 Linux 挂载磁盘操作指南
在进行磁盘挂载操作之前,你需要做好以下准备工作:通过以下命令查看磁盘是否已经存在分区:若 的输出中没有目标磁盘对应的分区信息(如 ),或者 里目标磁盘没有子节点,说明该磁盘未分区,需要进行分区操作。若磁盘已有分区,则可跳过分区步骤,直接进行格式化。(二)创建分区(针对未分区磁盘)使用 工具对磁盘进行分区,以 为例:进入 的交互模式后,按照以下步骤操作:创建分区后,让内核重新读取分区表以识别新分区:三、格式化分区(针对未格式化磁盘)格式化分区会清除分区内的所有数据,请确保已备份重要
2025-03-25 15:10:01
1961
原创 一般机器学习有哪些算法?
传统的机器学习算法主要依赖统计学和优化方法,不依赖深层神经网络,通常具有较高的可解释性且适用于中小规模数据集。通过最小化预测值与真实值的平方误差,拟合特征与目标之间的线性关系。:房价预测、销量趋势分析。和在线性回归基础上加入L2或L1正则化,防止过拟合。:高维数据回归(如基因数据分析)。基于支持向量机(SVM)的回归方法,通过间隔最大化优化预测边界。通过Sigmoid函数将线性回归结果映射到概率,用于二分类或多分类。:信用评分、疾病预测。寻找最大间隔超平面分割数据,支持核技巧处理非线性问题。
2025-03-14 22:54:31
845
原创 深度学习有哪些算法?
深度学习包含多种算法和模型,广泛应用于图像处理、自然语言处理、语音识别等领域。希望这份分类能帮助你系统了解深度学习算法!如需某个方向的详解,可进一步探讨。
2025-03-14 22:41:02
1798
转载 利特尔法则在计算机系统中的应用
在引出今天的主角Little's Law之前,有必要先统一一下我们描述“性能”的“基本语言”,毕竟语言不通是没法交流的不是。稳定的系统中同时被服务的用户数量等于用户到达系统的速度乘以每个用户在系统中驻留的时间,适用于所有需要排队的场景。N = X * R,其中N 表示系统中同时活动的用户,X 表示用户相继到达系统的速率,在稳定(这个词非常重要!!!)状态(用户到达系统的速度等于用户离开系统的速度)时即为系统吞吐量,R 表示每个用户在系统中平均的驻留时间。
2025-03-12 15:19:28
52
原创 利特尔法则(Little‘s Law)
利特尔法则(Little’s Law)是排队论中的一个基本定理,由约翰·利特尔(John Little)于1954年提出并于1961年证明。它描述了一个稳定的系统中,、**平均到达率(λ)
2025-03-12 15:02:00
365
原创 Java 线程池的核心线程数已满,什么情况下会创建新的线程?
是创建新线程的必要条件。此时,线程池会突破核心线程数限制,创建新线程直至达到最大线程数,后续任务将。
2025-03-09 19:55:25
235
原创 Java线程池 execute方法和submit方法,异常处理有何不同?
execute方法execute方法是Executor接口定义的方法,在类中实现,用于提交一个Runnable任务到线程池执行。submit方法submit方法是接口定义的方法,有多个重载版本,可接受Runnable或Callable任务,并且会返回一个Future对象,用于获取任务的执行结果。execute方法提交的任务抛出异常时,异常会直接影响工作线程,需要在任务内部或通过线程的进行处理。submit方法提交的任务抛出异常时,异常会被封装在Future对象中,需要通过调用Future的get。
2025-03-09 13:10:23
333
原创 httpclient4.5 的 httpclient对象是可以作为单例复用的吗?
Apache HttpClient 4.5 的 `HttpClient` 对象可以作为单例复用,且这是官方推荐的最佳实践
2025-03-06 13:13:59
826
转载 ElasticSearch踩坑日记:Logstash同步数据库有type字段导致同步失败
通常情况下,我们都会在Logstash为pipeline指定type,用来区分不同管道的同步处理。解决方案就是把结果集的type字段改名,暂时只找到这个方案,这纯粹就是Logstash的设计问题。当SQL语句返回的也有type同名字段时,运行Logstash不会同步任务数据,也不会报错。
2025-02-19 15:09:03
32
原创 Linux nohup
nohup是 Linux 系统中一个非常实用的命令,它的英文全称是 “no hang up”(不挂断),主要用于在用户退出登录或者终端会话关闭后,让指定的程序在后台持续运行,而不会受到 HUP(hangup)信号的影响而终止。以下为你详细介绍nohup的使用方法、注意事项等内容。
2025-02-17 16:50:07
899
原创 Linux /dev/null
dev/null是一个简单但功能强大的工具,在处理输入输出、文件操作和程序测试等方面都有广泛的应用,可以帮助用户更灵活地控制命令的执行和输出。
2025-02-17 16:19:13
521
原创 elasticsearch8 linux版以服务的方式启动
作为系统初始化系统的 Linux 发行版(如 CentOS 7 及以上、Ubuntu 16.04 及以上),需要创建一个。这样,每次系统启动时,Elasticsearch 服务都会自动启动。创建或修改服务文件后,需要重新加载。
2025-02-15 15:55:26
489
原创 自签名证书和可信证书的区别
当用户访问使用自签名证书的网站时,浏览器会显示安全警告,提示用户该连接可能不安全,这会让用户对网站的安全性产生疑虑。例如,在浏览器中访问使用自签名证书的网站时,地址栏可能会显示红色或黄色警告标识。
2025-02-15 14:50:49
379
转载 奇淫巧技,异步编程 CompletableFuture 是真的优雅
任务 1 执行完了再执行任务 2,甚至任务 1 执行的结果,作为任务 2 的入参数等等强大功能,下面就来学学 CompletableFuture 的 API。与此同时,Future 无法解决多个异步任务相互依赖的场景,简单点说就是,主线程需要等待子线程任务执行完毕之后在进行执行,这个时候你可能想到了 「表示第一个任务执行完成后,执行第二个回调方法任务,会将该任务的执行结果,作为入参,传递到回调方法中,并且回调方法是有返回值的。在大量请求过来的时候,处理逻辑复杂的话,响应会很慢。
2025-02-06 15:32:19
50
转载 Py-spy:优秀的 Python 程序性能监控、分析器
以获取有关其他选项的信息,包括更改采样率,仅包含 GIL 的线程进行过滤,对本机 C 扩展进行概要分析,显示线程 ID,概要分析子进程等。编写的,并且与配置的Python 程序不在同一进程中运行。py-spy 在命令行中进行工作,获取你要从监控的程序的 PID 或你要运行的 python 程序的文件。Top 显示了在 python 程序中花费最多时间的函数的实时视图,类似于 Unix top 命令。py-spy 可在 Linux,OSX,Windows 和 FreeBSD 上运行,并支持所有最新版本的。
2025-01-03 17:09:07
446
转载 Java| Charset.defaultCharset()和file.encoding的关系
返回此 Java 虚拟机的默认 charset。默认 charset 在虚拟机启动时决定,通常根据语言环境和底层操作系统的 charset 来确定。是操作系统的编码,可以通过虚拟机启动时指定属性,来更改指的是jvm输入流、输出流默认使用的编码/解码方式。当我们需要指定编码格式,可以通过JVM参数在启动的时候进行设置,从而不受操作系统和语言环境的影响.获取默认编码格式的源码如下:①当我们不手动设置JVM参数。
2024-06-26 11:57:06
460
1
转载 Mysql五百万数据count(*)优化
如果不存在二级索引,那么会走主键索引;聚簇索引:每一个 InnoDB 存储引擎下的表都有一个特殊的索引用来保存每一行的数据,称为聚簇索引(通常都为主键),聚簇索引实际保存了 B-Tree 索引和行数据,所以大小实际上约等于为表数据量。这里我们由于走的是主键索引,所以 MySQL 需要先把整个主键索引读取到内存缓冲区,这是个从磁盘读写到内存的过程,而且主键索引基本等于整个表数据量(10GB+),所以非常耗时!二级索引:除了聚集索引,表上其他的索引都是二级索引,索引中仅仅存储了对应索引列及主键列。
2024-05-21 10:49:41
550
转载 mysql 数百万数据使用 count(*)查询太慢解决记录
最后加上了一个where id >= 0 的条件,查询时间为三秒。给test库的user表的id建立二级索引,过程可能慢一点。此时执行以下两条SQL语句发现速度依旧的慢,32秒。user表中数据有700W条。
2024-05-21 09:48:58
840
原创 Mysql8.0修改配置文件my.ini的坑
出现的问题:一般直接双击打开my.ini文件默认会用系统自带的记事本打开,如果打开后修改了其中的内容并通过记事本直接保存的话,下次重启就会导致mysql无法启动。解决办法:使用notepad++打开my.ini文件,选择使用ANSI编码,然后再保存。原因是mysql会以ANSI编码读取my.ini文件。
2024-05-11 17:27:02
942
原创 百度paddleocr GPU版部署
说明已成功安装,并且飞桨跟CUDA的版本也匹配上了。飞桨版本:2.6,操作系统:windows 10,安装方式:pip,计算平台:CUDA12.0(飞桨2.6最高支持CUDA12.0)由于飞桨2.6最高支持CUDA12.0,而Nvidia驱动程序能支持的最高cuda版本12.2,所以这里选择CUDA工具包12.0。一般我们是没有VS环境的,如果这个时候勾选上就很有可能导致安装失败,去掉之后我们下一步等待完成即可。由于网络原因,可能安装失败,多试几次就可以成功。安装完成后,就可以运行命令行识别图片文字了。
2024-03-15 11:06:36
2299
1
原创 Sql server强制走索引
遇到一个奇怪的问题,同样的SQL,只是一个where条件不一样,一个是column1 = 'AAA',一个是column1 = 'BBB',他们的查询效率却差距甚大,一个要60秒,一个1秒以下。查看查询计划,一个使用了索引,一个没有使用索引。如果强制使用索引,可能会导致选择不合适的执行计划,从而降低查询性能。因为索引强制是通过创建索引视图来实现的,而索引视图只保存了特定的索引列。只有在确定查询优化器选择的执行计划不合适,并且经过测试证明使用索引可以提高查询性能的情况下,才应该强制使用索引。
2024-01-24 09:46:48
1533
固定管理系统
2011-10-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人