自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(320)
  • 收藏
  • 关注

原创 ⭐️《LeetCode ε-收敛协议!LeetCode全部题目题解(2025持续更新)》

本人目前已将LeetCode所有算法题目刷完,特将题解整理于此,便于分享交流,所有题目均提供最优解方案和代码,所有解决方案均提供了C++代码实现,部分题目还提供了Java、Python代码。希望大家都可以早日成为大佬。

2025-05-14 17:02:27 1405

原创 全套算法汇总(算法大导航)

本文汇总了多个算法学习资源,主要包括LeetCode系列和左程云系列。LeetCode系列提供了所有算法题目的题解汇总,适合刷题和提升算法能力。左程云系列则涵盖了从基础到进阶的算法讲解,包括二进制和位运算、排序算法、链表、队列、栈、二叉树、递归、哈希表、堆结构、基数排序、单调栈、贪心算法等核心内容。这些资源为算法学习者提供了系统的学习路径和详细的讲解,适合不同阶段的开发者参考和练习。

2025-04-30 16:08:29 677

原创 提问的智慧

提问的智慧

2025-04-12 16:12:35 594

原创 在Windows系统下使用Scrcpy实现电脑与安卓设备无线连接,实现电脑操作手机/平板

在Windows系统下使用Scrcpy实现电脑与安卓设备无线连接,实现电脑操作手机/平板

2025-05-23 21:59:50 274

原创 第一节 分布式架构设计理论与Zookeeper环境搭建

本文介绍了分布式架构设计的基本理论和Zookeeper环境搭建的相关知识。首先,文章阐述了分布式系统的定义、特性及其与集群的区别,并分析了分布式系统面临的通信异常、网络分区、节点故障等问题。接着,文章深入探讨了分布式数据一致性,包括强一致性、弱一致性和最终一致性等不同级别,并介绍了CAP定理,即一致性、可用性和分区容错性三者之间的权衡关系。这些理论为理解分布式系统的设计和实现提供了基础,同时也为后续Zookeeper的学习和应用奠定了理论基础。

2025-05-22 19:23:16 784

原创 JVM优化Java代码时都做了什么?

JVM 的代码执行优化主要分为运行时优化和即时编译器(JIT)优化。运行时优化包括锁机制、内存分配机制等,而 JIT 优化则是将热点代码转换为机器码,采用方法内联、逃逸分析等技术。JVM 根据统计信息动态决定编译或解释执行代码,并可能移除不再热点的代码。生产实践中,可以通过调整热点代码门限值、Code Cache 大小、编译器线程数等手段进行调优。此外,减少进入安全点也是一种优化策略,但需注意其在不同场景下的影响。

2025-05-21 00:25:10 1174

原创 【代码之丑】新需求破坏了代码,怎么办?

在软件开发中,面对新需求时,开发者需要保持敏锐的“嗅觉”,审慎考虑代码的改动,避免不必要的复杂性。通过两个实际项目案例,本文探讨了如何在需求变更时,通过复用现有接口和分离职责来最小化代码改动。第一个案例中,通过复用审核不通过的接口来处理驳回需求,避免了新增接口和状态。第二个案例中,通过引入新的调度模型来处理定时提交需求,保持了核心业务实体的稳定性。这些做法强调了在代码设计中,对接口和实体的改动应基于业务需求和职责分离原则,确保系统的可维护性和扩展性。

2025-05-18 10:27:41 764

原创 架构设计三原则

从优秀程序员到架构师的跨越,关键在于应对“不确定性”。编程结果通常是确定的,而架构设计则充满不确定性,面对多种可能性时需做出选择。这种选择常让架构师陷入两难,如选择先进技术还是熟悉技术、采用哪种框架、数据库等。架构设计缺乏通用规范,更多依赖经验和直觉。然而,通过研究架构设计发展历史和多个公司的架构过程,可以总结出三个共性原则:合适原则、简单原则和演化原则。合适原则强调选择最适合当前条件和资源的方案,而非盲目追求业界领先;简单原则主张在满足需求的前提下选择最简单的方案,避免结构复杂性和逻辑复杂性带来的问题;演

2025-05-17 07:51:27 819

原创 从单体应用走向服务化

文章讨论了在软件开发中何时进行服务化拆分以及如何进行拆分。初期,为了快速验证产品可行性,通常采用单体应用架构。但随着功能的增加和开发团队的扩大,单体架构会导致开发、测试和部署效率降低,以及服务稳定性问题。此时应考虑服务化拆分,分为纵向拆分(按业务维度)和横向拆分(按公共功能维度)。文章还提出了服务化拆分前需要解决的几个关键问题,如服务定义、发布订阅、监控、治理和故障定位。最后,强调拆分应基于业务现状和团队能力,避免过度拆分。

2025-05-17 07:50:02 614

原创 再谈开源项目:如何选择、使用以及二次开发?

再谈开源项目:如何选择、使用以及二次开发?

2025-05-17 07:49:24 884

原创 谈谈App架构的演进

随着移动互联网的发展,App架构经历了多次演进,从早期的Web App到原生App,再到Hybrid App,最终发展为组件化、容器化和跨平台App。最初,Web App以其快速开发和低成本优势成为主流,但随着用户对体验要求的提升,原生App逐渐取代了Web App,解决了用户体验问题。然而,原生App在跨平台开发中存在重复开发的痛点,Hybrid App应运而生,平衡了开发速度和用户体验。随着超级App业务复杂度的增加,组件化和容器化架构成为解决可扩展性和团队协作的有效手段。近年来,跨平台App方案如Re

2025-05-17 07:48:33 522

原创 互联网技术演进的模式

互联网业务的发展通常遵循从初创期到成熟期的四个阶段,每个阶段的技术需求和挑战随着业务复杂性和用户规模的变化而变化。初创期强调快速创新和迭代,技术团队需灵活运用现有资源;发展期则注重功能的快速添加和系统优化;竞争期面对更多竞争对手,技术需求转向平台化和服务化以减少重复工作和系统间交互的复杂性;成熟期则追求精细优化和用户体验的提升。用户规模的扩大对系统性能和可用性提出了更高要求,技术架构需要从集中式向分布式转变。整个过程中,技术的演进都是围绕支持业务快速发展和应对量变带来的质变挑战。

2025-05-17 07:46:30 664

原创 RPC框架:10万QPS下如何实现毫秒级的服务调用?

RPC框架:10万QPS下如何实现毫秒级的服务调用?

2025-05-17 01:19:44 564

原创 架构分层:我们为什么一定要这么做?

文章探讨了系统架构分层的重要性及其与高并发设计的关系。在系统初期,为了快速上线,通常不考虑分层,但随着业务复杂度的增加,代码纠缠、模块依赖、扩展性差等问题显现,分层架构成为必要。分层架构通过将系统拆分为多个层次,每个层次有独立职责,协同提供完整功能,如MVC架构和三层架构(表现层、逻辑层、数据访问层)。分层设计简化了系统设计,提高了代码复用性,便于横向扩展,是高并发系统设计的常用方法。然而,分层架构也增加了代码复杂度和性能损耗,但相比于其带来的好处,这些缺陷是可以接受的。文章最后强调,在做架构决策时,应全面

2025-05-17 01:17:36 944

原创 套路篇:如何迅速分析出系统CPU的瓶颈在哪里?

CPU性能指标主要包括CPU使用率、平均负载、进程上下文切换和CPU缓存命中率等。CPU使用率进一步细分为用户CPU、系统CPU、等待I/O CPU、软中断和硬中断等,反映了CPU在不同状态下的时间分配。平均负载表示系统的平均活跃进程数,反映了系统的整体负载情况。进程上下文切换包括自愿和非自愿切换,过多的切换会影响性能。CPU缓存命中率则衡量了CPU缓存的复用情况,命中率越高,性能越好。为了获取这些指标,常用的工具有top、vmstat、pidstat等,这些工具可以帮助快速定位和解决CPU性能瓶颈。在实际

2025-05-17 00:46:21 568

原创 套路篇:磁盘 IO 性能优化的几个思路

本文介绍了如何通过基准测试工具 fio 来评估和优化 I/O 性能。首先,文章强调了理解 I/O 性能指标的重要性,并指出不同应用场景下这些指标的标准可能不同。接着,详细介绍了如何使用 fio 进行基准测试,包括安装、常用选项和测试命令。文章还解释了测试报告中的关键参数,如 slat、clat、lat、bw 和 iops,并提供了如何通过 blktrace 和 fio 组合来精确模拟应用程序 I/O 模式的方法。最后,文章总结了通过基准测试报告找出 I/O 性能瓶颈并进行优化的思路。

2025-05-17 00:40:49 784

原创 HTTP API 认证授权术

本文系统总结了常见的API认证技术,包括HTTP Basic、Digest Access、App Secret Key + HMAC、JWT、OAuth 1.0和OAuth 2.0。HTTP Basic通过Base64编码传输用户名和密码,安全性较低;Digest Access使用MD5哈希避免明文传输密码,但仍可能被暴力破解;App Secret Key + HMAC结合密钥和哈希算法增强安全性;JWT通过JSON Web Token实现无状态认证;OAuth 1.0和2.0则分别通过三脚和两脚授权流程,

2025-05-17 00:36:22 790

原创 套路篇:CPU 性能优化的几个思路

性能优化是一个复杂且需要谨慎处理的过程。在发现性能瓶颈后,不应立即进行优化,而是应先评估优化的效果、选择最关键的优化对象,并权衡不同优化方法的利弊。性能优化应从应用程序和系统两个维度入手,通过减少不必要的工作、使用更高效的算法、异步处理、多线程、缓存等方法提升应用程序性能,同时通过CPU绑定、优先级调整、资源限制、NUMA优化等手段优化系统资源使用。然而,过早优化可能带来复杂性和维护成本的增加,因此应逐步进行,确保优化措施适应不断变化的需求。

2025-05-17 00:32:52 732

原创 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)

本文主要探讨了如何通过 ps 和 top 命令查看进程状态,并重点分析了不可中断状态和僵尸进程。不可中断状态通常表示进程正在与硬件交互,系统不允许中断;僵尸进程则是已退出但未被父进程回收资源的进程。通过案例,作者展示了如何分析 iowait 过高和僵尸进程增多的问题。使用 dstat 和 pidstat 工具,作者发现 iowait 升高与磁盘读请求有关,并通过 strace 尝试追踪系统调用,但遇到权限问题。最终,通过 ps 命令确认进程已变为僵尸状态。文章提供了详细的命令和步骤,帮助读者理解并解决类似问

2025-05-17 00:32:07 733

原创 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(上)

本文主要探讨了在遇到无法解释的 CPU 使用率问题时,如何通过检查短时应用和进程状态来诊断问题。短时应用由于运行时间短,难以通过常规工具如 top 或 ps 发现,需借助 execsnoop 或 perf top 等记录事件的工具。文章还详细介绍了 CPU 使用率的类型,包括用户 CPU、系统 CPU、等待 I/O 的 CPU 和中断 CPU,并重点分析了 iowait 升高的情况,指出此时进程可能处于不可中断状态(D 状态)。此外,文章回顾了进程的多种状态(如 R、D、Z、S、I 等),并通过一个多进程

2025-05-17 00:30:54 836

原创 谈谈Spring Bean的生命周期和作用域?

在企业应用开发中,Java凭借其开放的Java EE规范和强大的开源框架,尤其是Spring框架,成为了主流选择。Spring框架不仅提供了依赖注入(控制反转)和面向切面编程(AOP)等核心机制,还定义了明确的Bean生命周期和作用域,使得应用开发更加模块化和灵活。Spring Bean的生命周期包括创建和销毁两个过程,涉及多个步骤,如实例化、属性设置、依赖注入和初始化等。作用域方面,Spring提供了Singleton和Prototype等基础作用域,以及针对Web容器的Request、Session和G

2025-05-17 00:19:06 746

原创 信号量能被 FixedThreadPool 替代吗?

信号量(Semaphore)是一种用于控制并发访问资源的机制,通过维护“许可证”的数量来限制同时访问共享资源的线程数。线程在访问资源前必须先获取许可证,使用完毕后释放许可证。当许可证数量为0时,后续线程必须等待,直到有许可证被释放。信号量的主要应用场景是保护资源,防止过多的并发请求导致系统崩溃。例如,在访问慢服务时,可以通过信号量限制同时访问的线程数,确保服务不被压垮。信号量的使用流程包括初始化、获取许可证和释放许可证三个步骤,支持公平和非公平策略。通过合理使用信号量,可以有效控制并发访问量,保护系统资源。

2025-05-17 00:19:03 806

原创 有哪几种实现生产者消费者模式的方法?

有哪几种实现生产者消费者模式的方法?

2025-05-16 09:50:52 566

原创 ThreadLocal 是用来解决共享资源的多线程访问的问题吗?

ThreadLocal 并不是用来解决共享资源的多线程访问问题的。它通过为每个线程提供独立的资源副本,避免了线程间的资源竞争,从而解决线程安全问题。与使用锁(如 synchronized)不同,ThreadLocal 通过资源隔离而非同步来实现线程安全。然而,如果 ThreadLocal 中存储的资源是静态的(即共享的),则仍可能引发线程安全问题。因此,ThreadLocal 适用于需要为每个线程提供独立资源的场景,而不适用于处理共享资源的并发访问。在面试中,理解 ThreadLocal 的正确使用场景及其

2025-05-16 09:49:44 753

原创 内存泄漏——为何每次用完 ThreadLocal 都要调用 remove()?

内存泄漏是指对象不再有用时,其占用的内存无法被回收,导致可用内存逐渐减少,最终可能引发内存不足错误。在ThreadLocal中,内存泄漏可能通过Key和Value的泄漏发生。Key的泄漏通过弱引用机制得到缓解,但Value的泄漏仍可能发生,尤其是在线程长时间运行的情况下。为避免内存泄漏,应在使用完ThreadLocal后手动调用其remove方法,以清理对应的Value对象,确保内存能被正常回收。

2025-05-16 09:48:32 988

原创 什么是“内存可见性”问题?

本文通过两个案例探讨了Java中的可见性问题。案例一中,两个线程分别执行write和read方法,由于线程工作内存与主内存的同步延迟,导致read线程读取到的x值可能不是最新的。案例二中,两个线程分别执行change和print方法,由于线程执行顺序和可见性问题,可能导致print方法输出不一致的结果,如b=30;a=10。为了解决可见性问题,可以使用volatile关键字,确保变量的修改对所有线程立即可见。此外,synchronized、Lock等工具也能在一定程度上保证可见性。synchronized不

2025-05-16 09:47:38 972

原创 单例模式的双重检查锁模式为什么必须加 volatile?

单例模式的双重检查锁模式为什么必须加 volatile?

2025-05-16 09:46:39 682

原创 volatile 的作用是什么?与 synchronized 有什么异同?

volatile 的作用是什么?与 synchronized 有什么异同?

2025-05-16 09:45:46 541

原创 如何写一个必然死锁的例子?

如何写一个必然死锁的例子?

2025-05-16 09:44:52 1014

原创 构造复杂的程序:将一个递归函数转成非递归函数的通用方法

这篇面试题探讨了在不支持递归的程序语言中如何实现递归程序,并通过分析for循环、条件控制程序和函数的底层实现,展示了如何将高级语言结构转换为底层指令。文章首先通过for循环的例子,解释了如何使用jump指令实现循环控制,接着讨论了if-else和switch-case的条件控制逻辑,最后深入探讨了函数的执行过程,特别是如何通过栈结构传递参数和返回值。通过这些例子,文章强调了理解底层指令和数据结构的重要性,展示了如何将复杂的高级语言功能分解为简单的底层操作,从而在不支持递归的语言中实现递归功能。

2025-05-16 00:34:00 801

原创 区块链技术 - 智能合约

区块链技术 - 智能合约

2025-05-16 00:29:07 892

原创 微服务架构:微服务究竟是灵丹还是毒药?

搜索引擎如Google能够在极短时间内处理海量数据并返回搜索结果,主要依赖于倒排索引技术。倒排索引通过将单词与包含该单词的文档列表关联,实现快速检索。Google首先通过网络爬虫获取全球网页,解析并建立倒排索引。搜索时,通过哈希表快速定位单词,获取相关文档列表,并通过缓存加速搜索。此外,Google使用PageRank算法对搜索结果进行排序,根据网页的权重(即被其他网页推荐的程度)决定展示顺序。对于站内搜索,如豆瓣或知乎,可以使用点赞数或词频(TF)等指标进行排序。搜索引擎技术不仅应用于互联网搜索,也广泛应

2025-05-16 00:25:32 581

原创 AI与物联网架构:从智能引擎到物联网平台

大数据技术主要分为三大类:底层技术、平台技术和算法技术。底层技术包括MapReduce、Spark等计算框架,用于处理大规模数据。平台技术则负责连接大数据计算和实时应用,如电商推荐系统,通过数据采集、处理、输出等步骤实现数据的高效利用。算法技术,特别是机器学习算法,如智能推荐算法,通过分析用户行为数据,提供个性化推荐。此外,物联网大数据架构通过终端设备数据采集和处理,结合AI算法,实现智能控制。大数据技术的应用关键在于平台的开发和算法的优化,以挖掘数据的最大价值。

2025-05-16 00:24:01 929

原创 区块链技术架构:区块链到底能做什么?

区块链技术架构:区块链到底能做什么?

2025-05-16 00:23:02 856

原创 什么样的代码才是高效的代码?

什么样的代码才是高效的代码?

2025-05-16 00:19:36 520

原创 分布式技术是如何引爆人工智能的?

人工智能(AI)是通过模拟人类思维和行为,使机器具备智能的技术。其核心包括数据、模型和算力,其中数据处理和模型训练是关键环节。数据处理通过统计、集成、清理、规约和变换等方法,提升数据质量,为模型训练提供高质量输入。模型训练则是从数据中寻找规律,通过分布式技术(如数据分布式训练、模型分布式训练和混合模型训练)提升效率,缩短训练时间。分布式技术通过集群管理和通信,解决了大规模数据和大模型训练中的算力瓶颈,推动了人工智能的广泛应用。

2025-05-16 00:17:46 997

原创 分布式缘何而起:从单兵,到游击队,到集团军

本文探讨了分布式计算的起源及其发展过程,从单机模式到数据并行(数据分布式)模式,再到任务并行(任务分布式)模式。单机模式将所有应用和数据集中在一台计算机上,便于维护但性能受限且存在单点失效问题。数据并行模式通过拆分数据并利用多台计算机并行处理多个相同任务,提高了总体任务处理效率,但对单个任务的性能提升有限。任务并行模式则将复杂任务拆分为多个子任务,并在不同计算机上并行执行,从而缩短整体任务执行时间,但增加了设计复杂性。分布式计算的核心在于将相同或相关程序运行在多台计算机上,以实现性能、可用性和可扩展性的提升

2025-05-16 00:09:59 766

原创 Java内存模型中的happen-before是什么?

Happen-before关系是Java内存模型(JMM)中确保多线程操作可见性的核心机制,它精确定义了操作之间的顺序和内存可见性。JMM通过happen-before规则(如程序顺序、volatile变量、锁操作等)保证多线程程序的正确性和一致性。JMM的引入解决了早期Java内存模型中的模糊性和不一致性问题,确保了程序在不同处理器架构上的可移植性。JMM的实现依赖于内存屏障等技术,通过禁止某些重排序来保证内存可见性。对于开发者而言,理解JMM和happen-before关系有助于编写可靠的多线程程序,避

2025-05-15 18:41:30 792

原创 AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?

AtomicInteger是Java中用于实现原子操作的类,基于CAS(Compare-And-Swap)技术确保线程安全。CAS通过比较当前值与预期值,若一致则更新,否则重试或返回失败。AtomicInteger内部依赖Unsafe类进行底层操作,并使用volatile修饰的value字段保证可见性。其原子操作如getAndIncrement通过Unsafe的getAndAddInt方法实现,失败时重试。CAS是Java并发中无锁机制的基础,适用于高并发场景。Java提供了Atomic包和Variable

2025-05-15 18:40:47 946

原创 synchronized底层如何实现?什么是锁的升级、降级?

本文详细介绍了Java中synchronized锁的实现机制及其优化策略。在Java 6之前,synchronized依赖于操作系统的互斥锁,性能较差。现代JDK通过引入偏斜锁、轻量级锁和重量级锁三种实现,显著提升了性能。锁的升级和降级是JVM根据竞争情况自动调整锁机制的过程。偏斜锁通过CAS操作标记对象头,适用于无竞争场景;当出现竞争时,JVM会撤销偏斜锁并升级为轻量级锁或重量级锁。锁降级在JVM进入安全点时也会发生。文章还从源码层面分析了synchronized的底层实现,并探讨了偏斜锁的适用性和争议。

2025-05-15 18:39:56 827

桌面电子宠物(进击的巨人)

桌面电子宠物,主打的就是陪伴

2025-05-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除