- 博客(193)
- 收藏
- 关注
原创 计算机网络-网络层
想象一下全球的邮政系统。你写好一封信(数据),写上收信人的地址(目标地址)和自己的地址(源地址),然后投进邮筒。邮政系统会负责把这封信通过各种交通工具(火车、飞机、汽车)和中转站(分拣中心),最终送到收信人手中,无论收信人在世界的哪个角落。网络层在计算机网络中就扮演着类似邮政系统的角色。OSI 模型和 TCP/IP 模型中的位置在经典的 OSI (Open Systems Interconnection) 七层参考模型中,网络层是第三层,位于数据链路层之上,传输层之下。
2025-06-01 18:08:36
1268
原创 缓存并发更新的挑战
这是最直观也最常见的问题。多个客户端(或线程/进程)几乎同时读取同一份数据的初始状态(例如,库存量为100)。它们各自基于这个初始状态进行修改(A减1变99,B减2变98),然后先后写回。由于B的写入操作发生在A之后,B写入的98会覆盖A写入的99。最终结果是库存为98,但逻辑上正确的库存应该是100 - 1 - 2 = 97。A的操作 фактически丢失了。// 初始库存: 100// 线程A// 读取到 100// 计算为 99// ... 可能有一些耗时操作 ...// 写入 99。
2025-04-27 16:20:07
1236
原创 Redis 缓存并发问题深度解析:击穿、雪崩与穿透防治指南
缓存击穿,简单来说,是指某个访问极其频繁的热点 Key,在它失效的瞬间,恰好有大量的并发请求访问这个 Key。由于缓存已过期(或被剔除),这些并发请求无法命中缓存,便会“击穿”缓存层,同时涌向后端的数据库或其他数据源,导致数据库压力瞬间剧增,甚至可能被打垮。想象一下某个电商平台的爆款商品详情页,这个商品 ID 就是一个典型的热点 Key。平时成千上万的用户请求都由 Redis 缓存扛着,毫秒级响应。
2025-04-27 14:57:07
830
原创 Redis 有序集合 ZSet 深度解析教程
ZSet 是 Redis 提供的一种有序集合数据结构。你可以把它想象成一个集合,但这个集合里的每个元素(我们称之为成员 member)都额外绑定了一个浮点数类型的分数 score。ZSet 最重要的特性就是它会根据 score 对 member 进行排序。核心特性总结:和普通的 Set 一样,ZSet 中的 member 是唯一的,不允许重复。如果你尝试添加一个已经存在的 member,只会更新它的 score。每个 member 都必须关联一个 score。
2025-04-24 14:53:06
953
原创 JVM-类加载机制
对于Java开发者来说,我们每天都在编写.java文件,然后通过编译器将其编译成.class文件。那么,这些.class文件是如何被加载到Java虚拟机(JVM)中,并最终变成我们可以在程序中使用的对象和方法的呢?这个过程就是类加载(Class Loading)。理解类加载机制,不仅仅是满足技术好奇心,更是解决实际问题的关键。你是否遇到过或异常?是否好奇为什么 Tomcat 等Web容器可以隔离不同应用的类库?是否想了解热部署、模块化等高级特性是如何实现的?这些问题的答案,都深藏在类加载机制之中。类加载。
2025-04-24 10:35:53
1173
原创 深入理解 G1 GC:已记忆集合(RSet)与收集集合(CSet)详解
RSet 解决了“如何找到指向特定 Region 的引用”的问题,使得 G1 可以独立评估每个 Region 的存活性。但 G1 并不会在一次 GC 中回收所有可回收的 Region。为了满足用户设定的暂停时间目标,G1 必须精心选择一部分 Region 来构成单次 STW 回收的集合。这个集合就是收集集合 (Collection Set, CSet)。在一次 GC 暂停 (STW)期间,G1 将要回收(Evacuate)的所有 Region 的集合。
2025-04-23 11:46:58
990
原创 深入JVM内存分配-本地分配缓冲(LAB)与TLAB详解
虽然本文重点是 TLAB,但简单了解 GCLAB 和 PLAB 有助于我们理解 LAB 思想的一致性。在使用复制算法(如 Parallel Scavenge 的 Minor GC, G1 的 Mixed GC)或标记-复制算法进行垃圾回收时,多个 GC 线程需要将存活的对象从源区域(如 Eden, Survivor From)复制到目标区域(如 Survivor To, Old Gen)。
2025-04-23 11:23:00
669
原创 JVM-卡表
卡表本质上是一个字节数组(byte[]。它将整个堆内存划分成固定大小的连续区域,每个区域称为一个“卡页(Card Page)”或“卡(Card)”(通常是 2 的幂次方大小,如 512 字节)。卡表中的每一个字节都对应堆内存中的一个卡页。画一个堆内存条,下面对应一个卡表数组,展示其映射关系。卡表中每个字节的值代表其对应卡页的状态。最简单的实现中,有两种状态:通常用 0 表示,意味着对应的卡页“可能没有”需要关心的引用(具体含义看应用场景)。
2025-04-23 09:56:34
1018
原创 深度学习与总结JVM专辑(七):垃圾回收器—CMS(图文+代码)
在Java虚拟机(JVM)的众多垃圾收集器(Garbage Collector, GC)中,CMS(Concurrent Mark Sweep)占有特殊的历史地位。虽然它在较新的JDK版本中已被标记为废弃(Deprecated)并最终移除,但理解CMS的设计理念、工作原理以及优缺点,对于深入掌握JVM内存管理、理解后续更先进的GC(如G1、ZGC)的演进思路,仍然具有非常重要的价值。CMS的核心目标是什么?简单来说,CMS的设计目标是获取尽可能短的回收停顿时间.
2025-04-22 08:21:26
1438
原创 阻塞队列-ArrayBlockingQueue
(JUC) 包提供了多种阻塞队列的实现,其中以其有界基于数组和线程安全的特性,在需要精确控制资源和流量的场景中扮演着重要角色。是包提供的一个有界阻塞队列。顾名思义,它的内部实现基于数组结构,并且在创建时必须指定一个固定的容量,这个容量在队列创建后不可改变。这个管道的长度在你创建它的时候就定死了,比如只能同时容纳 10 个物品。不能多也不能少,长度无法动态调整。物品(元素)从管道的一端放入(入队),从另一端取出(出队),遵循先进先出 (FIFO)的原则,就像排队一样。
2025-04-21 17:27:25
716
原创 Fork/Join - ForkJoinTask
高效并行处理:通过分治算法和工作窃取,优化多核处理器资源利用简化并行编程:框架自动处理任务调度、负载均衡和结果合并性能提升:特别适合CPU密集型的递归分解任务,可实现接近线性的加速比自适应调度:通过工作窃取,自动平衡不同工作线程的负载丰富的API:提供了多种子类和工具方法,满足不同场景需求大数据处理:处理大型数组、集合和数据集的并行操作搜索和排序:实现高效的并行排序、查找和过滤图像处理:并行处理图像滤镜、转换和分析科学计算:矩阵运算、模拟和数值分析Java平台核心功能。
2025-04-21 16:43:28
1071
原创 JUC线程池- ForkJoinPool
给定一个,计算其中所有元素的总和。分治思路:如果数组片段足够小(小于某个阈值 THRESHOLD),直接用单线程循环计算这个小片段的和。如果数组片段大于阈值:将其从中间分成两半(左半部分和右半部分)。创建两个新的子任务,分别负责计算左半部分和右半部分的和。并行执行这两个子任务。等待两个子任务都完成后,将其结果相加,得到当前片段的和。回顾 Java 并发框架的演进,基本的Thread。并发编程困难且易错。引入包,提供),LockAtomic*, 并发集合等。
2025-04-21 14:18:00
1112
原创 应用层核心协议详解:HTTP, HTTPS, RPC 与 Nginx
应用层是互联网协议栈的最顶层,直接面向我们日常使用的各种网络应用,例如网页浏览、文件传输、电子邮件等。理解应用层的核心协议对于任何Web开发者来说都至关重要默认读者已具备基础的计算机网络知识(如TCP/IP模型、IP地址、端口等)。HTTP是Web的基础,理解其方法、状态码、版本演进和状态管理机制(Cookie, Session, JWT)至关重要。
2025-04-21 08:56:05
1119
原创 阻塞队列-BlockingQueue
想象一下现实生活中的流水线:上游工序不断生产零件(生产者),下游工序不断取用零件进行组装(消费者)。为了保证流水线顺畅运行,通常会在上下游之间设置一个传送带或缓冲区。这个缓冲区有几个关键作用:在多线程编程的世界里,我们也面临类似的问题:不同的线程可能扮演着生产者和消费者的角色,它们需要一种安全、高效的方式来传递数据或任务。如果直接让它们共享一个普通的集合(如 或 ),就会遇到很多麻烦:为了解决这些痛点,Java 并发包 () 提供了 (阻塞队列)接口及其多种实现。 是 包下的一个接口,它继承自 接口。
2025-04-18 15:53:28
788
原创 Java 线程中断机制详解
Java 线程中断是一种强大而优雅的线程协作机制,用于请求线程停止其当前任务。它并非强制终止,而是依赖于目标线程的主动响应。
2025-04-16 16:29:37
752
原创 JUC- CompletableFuture
不带Async后缀的方法 (如thenApplythenAcceptthenRun这类方法的执行线程不是固定的,遵循“谁触发,谁执行(或调用者执行)”的原则。情况一:前置任务已经完成。当你调用thenApply时,如果它依赖的那个已经处于完成状态,那么thenApply里的回调逻辑会立即在当前调用线程中执行。情况二:前置任务尚未完成。当你调用thenApply时,如果前置任务还在运行(比如在某个线程池的线程 T1 中),那么这个回调逻辑会被“挂起”。当线程 T1 完成了前置任务后,
2025-04-16 10:05:05
989
原创 深入理解Condition接口
在多线程编程中,线程间的协作至关重要。我们经常遇到这样的场景:一个线程需要等待某个条件满足后才能继续执行,而这个条件的改变依赖于其他线程的操作。例如,在经典的“生产者-消费者”模式中,当缓冲区为空时,消费者线程需要暂停等待,直到生产者线程放入数据;当缓冲区满时,生产者线程需要暂停等待,直到消费者线程取出数据。Java 的Object类提供了wait()notify(), 和方法,它们与关键字配合,构成了 Java 内置的线程等待-通知机制。单一等待队列:一个锁对象只能关联一个等待队列。
2025-04-16 08:20:24
725
原创 LockSupport 深度解析
AQS 是 JUC 中大多数同步器(SemaphoreFutureTask等)的基础框架。AQS 内部维护了一个虚拟的 CLH (Craig, Landin, and Hagersten) 双向队列来管理等待获取同步状态(如锁)的线程。在 AQS 中的作用:阻塞获取失败的线程: 当一个线程尝试获取同步状态失败时(例如,调用lock()但锁已被占用),AQS 会将该线程包装成一个节点(Node)加入到等待队列的尾部。然后,在将节点安全地插入队列后,AQS 会调用(这里的this。
2025-04-15 15:32:27
1059
原创 Java Lock 深度解析
在 Java 并发编程里,关键字是我们最早接触也最常用的同步机制。它简单易用,能解决大部分场景下的线程安全问题。然而,随着业务场景的复杂化和对性能、灵活性的更高要求,的局限性也逐渐显现。此时,包下的Lock接口及其实现类应运而生,提供了更强大、更灵活的锁机制。了解 Java 线程基本概念(创建、状态、生命周期)。了解关键字的基本用法和原理。了解volatile关键字和 Java 内存模型(JMM)的基本概念。了解原子操作的基本概念。
2025-04-15 15:29:09
716
原创 深入学习ReentrantLock
在并发编程的世界里,"锁"是一个无法回避的核心概念。当多个线程需要访问共享资源时,如果没有适当的同步机制,就可能导致数据竞争、状态不一致等严重问题。Java 提供了多种同步机制,其中最基础、最常用的就是 关键字。 凭借其简单易用、虚拟机层面优化的特点,在许多场景下都是不错的选择。然而,随着业务场景的日益复杂, 的局限性也逐渐显现:为了弥补 的不足,Java 并发大师 Doug Lea 在 (JUC) 包中设计了 接口及其实现类,其中 就是最重要、最常用的实现之一。,顾名思义,是一个可重入的互斥锁
2025-04-15 15:12:06
676
原创 操作系统-内存管理
我们每天都在与内存打交道——定义变量、创建对象、处理数据。在高层语言和现代框架的帮助下,很多内存管理的细节被隐藏了。然而,理解内存管理的核心原理,对于编写高效、稳定、安全的代码至关重要。你是否遇到过程序莫名其妙地崩溃,最终定位到是“内存访问违例”或“段错误”?你是否调试过因为内存泄漏导致服务运行一段时间后资源耗尽的问题?你是否想优化程序性能,却不清楚数据应该放在栈上还是堆上更合适?你是否好奇为什么你的程序可以使用的内存“看起来”远超机器的物理内存?
2025-04-15 14:03:30
984
原创 JUC集合-CopyOnWriteArrayList
不变性 (Immutability):通过写时复制,确保任何时刻通过getArray()获取到的数组,其内容在被读取期间是不可变的。读操作访问的是一个稳定的数据结构。volatile关键字:保证了array数组引用的可见性。当一个写线程完成了新数组的创建并将array指向它之后,其他线程能立即看到这个更新,从而在后续的读操作中获取到新的数组快照。它建立了写线程更新引用与读线程读取引用之间的 happens-before 关系。互斥锁:保证了写操作之间的原子性和互斥性。
2025-04-15 13:45:41
637
原创 JUC线程池-ScheduledThreadPoolExecutor
默认情况下,创建的线程名字可能是这样的格式,不利于问题排查。你可以通过提供自定义的设置有意义的线程名称:例如,包含线程池的业务用途(如设置线程为守护线程 (Daemon Thread):如果希望这些线程不阻止 JVM 退出,可以将其设为守护线程。但要注意,如果主线程结束,守护线程会被强制终止,可能导致任务执行到一半。对于重要的定时任务,通常不建议设为守护线程。设置线程优先级。设置未捕获异常处理器 (:虽然任务内部的异常通常被捕获,但设置一个总可以捕获其他意外情况。示例 (使用 Guava 的。
2025-04-15 11:47:22
300
原创 JUC线程池-FutureTask
核心要点回顾:解决了什么问题:解决了传统多线程编程中手动管理状态、同步、异常和结果获取的复杂性与易错性。核心机制:基于volatile状态变量 (state)、CAS 原子操作和的等待/通知机制,实现了高效的线程安全和异步协作。状态管理:通过明确的状态(NEWCOMPLETINGNORMALCANCELLED)及其单向转换,精确控制任务生命周期。关键 API构造器:接受Callable或Runnableresult。run(): 执行任务的核心入口,保证执行一次。get()
2025-04-15 11:45:26
720
原创 JUC工具类-ThreadLocal
可以通过继承并重写其和方法,在任务执行前后进行全局的清理。: 在任务r即将被线程t执行之前调用。: 在任务r执行完毕后调用(无论正常结束还是异常退出)。// 假设我们知道应用中主要使用的 ThreadLocal 变量// 复用之前的例子// 可能还有其他的 ThreadLocal...@Override// 可以在任务开始前做一些准备,或者确保初始状态干净 (虽然 afterExecute 更常用)@Override// 在任务执行完毕后,清理已知的 ThreadLocal 变量。
2025-04-15 10:49:59
615
原创 JUC工具类-Semaphore
你正在管理一个停车场,这个停车场只有 10 个停车位。同一时间,可能有几十辆甚至上百辆车想要进入停车场。作为管理员,你不能让所有的车都挤进来,因为车位是有限的。你需要一个机制来控制:最多只允许 10 辆车同时停放。当有车离开时,你才能允许下一辆车进入。在开发中,我们经常遇到类似的情况。
2025-04-15 10:33:24
1314
原创 JUC工具类-Phaser
Phaser是包下的一个可重用的同步屏障(Synchronization Barrier)类,其功能类似于和,但提供了更强的灵活性。它允许多个线程(称为参与者,Parties)分阶段地进行同步,等待彼此到达某个同步点(称为阶段屏障,Phase Barrier)后再继续执行。Phaser的主要作用是协调多个线程分阶段地共同完成一项复杂任务。想象一个大型项目,需要分解成多个连续的阶段,每个阶段内部又包含多个可以并行处理的子任务。Phaser。
2025-04-15 10:22:26
802
原创 JUC工具类-Exchanger
是包中的一个同步工具类,用于两个线程之间的数据交换。它提供了一个同步点,当两个线程都到达该点时,它们就可以交换数据。实现两个线程间的双向数据传递构建双缓冲结构,实现数据处理与生成分离替代共享队列,实现直接交换数据的生产者-消费者模式在遗传算法中用于染色体交换在管道处理架构中用于模块之间的数据传递ExchangerArena是一个由多个槽位组成的数组结构,允许多个线程并行配对交换。每个线程将被分配到 Arena 的一个槽位层级(level)进行配对。
2025-04-15 09:08:51
979
原创 JUC工具类-CyclicBarrier
集合等待:允许一定数量的线程在达到屏障时互相等待,直到所有线程到达指定点。屏障触发:当所有线程都达到屏障时,屏障“开启”,所有线程同时被唤醒继续执行。触发动作:可选的屏障动作(barrierAction),用于在所有线程到达后执行特定的逻辑,如合并计算结果或状态更新。循环可重用:在所有线程通过屏障后,自动重置计数器,支持多次使用。简单地说,CyclicBarrier 就像“远足团队的集合点”,所有线程(团队成员)到达后,等待人员数量达到约定值后一起出发,而这一集合过程可以在整个任务中不断重复使用。
2025-04-15 08:55:44
1003
原创 JUC工具类-CountDownLatch
是一个用于线程同步的工具类,允许一个或多个线程等待其他线程完成操作。它包含一个计数器,初始值通过构造函数设定。当其他线程调用方法后,计数器减一;当计数器值为 0 时,所有调用await()被阻塞的线程被唤醒。CountDownLatch 虽然看似简单,但其背后的原理体现了 Java 并发编程的设计精髓。通过本篇内容,相信你不仅掌握了它的使用方式,更理解了它为何如此设计、如何保证线程安全、以及如何灵活应用。
2025-04-15 08:45:12
819
原创 计算机网络- 传输层安全性
传输层安全协议(Transport Layer Security,TLS)和其前身安全套接字层(Secure Sockets Layer,SSL)是最广泛使用的传输层安全协议,为网络通信提供加密、身份验证和数据完整性保护。公钥基础设施(Public Key Infrastructure,PKI)是一套用于创建、管理、分发、使用、存储和撤销数字证书的系统,为非对称加密提供可信的公钥分发机制。公钥用于加密,私钥用于解密;数字证书是由可信的第三方(证书颁发机构,CA)签发的电子文档,用于证明公钥持有者的身份。
2025-04-11 13:34:38
870
原创 计算机网络- UDP协议详解
*UDP(User Datagram Protocol,用户数据报协议)**是OSI模型和TCP/IP模型中传输层的一个简单协议,由IETF的RFC 768定义。UDP提供了一种无需建立连接就可以发送封装的IP数据报的方法,它仅提供数据的不可靠传输,即不保证数据的交付、不保证数据的顺序、不保证数据的完整性。与TCP不同,UDP(用户数据报协议)是一种简单的、无连接的传输层协议,它提供了最小的传输服务,没有建立连接、确认、重传或流量控制等机制。本章将深入探讨UDP的原理、特性、实现和应用。
2025-04-11 13:31:44
1288
原创 计算机网络-TCP流量控制与拥塞控制
在计算机网络中,如果数据的发送速率超过了网络的处理能力,就会导致网络拥塞,表现为数据包丢失、延迟增加等问题。TCP流量控制的核心思想是:接收方通过通告窗口(Advertised Window)告知发送方自己的接收能力,发送方根据接收方的通告窗口调整自己的发送速率。如果应用程序发送数据的速率超过了网络的处理能力,拥塞控制机制会限制实际的发送速率,防止网络拥塞。TCP流量控制是一种重要的机制,它通过调节发送方的发送速率,确保接收方能够处理所有接收到的数据,防止缓冲区溢出导致的数据丢失。
2025-04-11 13:31:11
989
原创 计算机网络-TCP可靠传输机制
如果接收方收到了乱序的数据段,它会发送重复确认(duplicate ACK),确认号仍然是期望接收的下一个字节的序列号。为了减少网络开销,TCP通常不会立即确认每个接收到的数据段,而是延迟一段时间(通常是200ms),希望在这段时间内有数据要发送,可以将确认捎带在数据段中。TCP的差错控制机制是其可靠传输的重要组成部分,它通过多种机制检测和处理传输过程中可能出现的错误,确保了数据的完整性和正确性。滑动窗口机制是TCP流量控制和可靠传输的核心机制,它通过动态调整窗口大小,实现了发送方和接收方之间的流量平衡。
2025-04-11 13:30:03
1148
原创 计算机网络-TCP协议详解
传输控制协议(Transmission Control Protocol,TCP)是互联网协议族中最核心的协议之一,由Vint Cerf和Bob Kahn在1974年设计并于1981年在RFC 793中正式定义。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,为应用程序提供了可靠的数据传输服务,确保数据能够无错、按序地从源主机传输到目标主机。TCP连接在其生命周期中会经历多个状态,每个状态都有其特定的含义和行为。CLOSED:表示没有连接,这是初始状态和最终状态。LISTEN。
2025-04-11 13:29:24
1658
原创 计算机网络-传输层基础概念
传输层是计算机网络体系结构中的第四层,位于网络层之上,应用层之下。它是整个网络体系结构中的关键部分,提供了端到端的通信服务,使得应用程序能够在不同主机之间可靠地交换数据,而无需关心底层网络的复杂性。提供端到端的通信服务:传输层建立了应用进程之间的逻辑通信,使得通信双方的应用进程认为它们是直接相连的,尽管实际上它们可能位于地球的两端,中间经过了复杂的网络路径。屏蔽底层网络的差异:传输层向上层提供统一的接口,使应用层无需关心底层网络的具体实现和差异,从而简化了应用程序的开发。提供多种服务质量选择。
2025-04-11 13:28:22
767
原创 HTTP 协议-应用层
HTTP(HyperText Transfer Protocol)是互联网的核心应用层协议,主要用于浏览器与服务器之间的数据传输。HTTP 协议建立在 TCP/IP 协议之上,采用请求-响应模式实现通信。示例:当你在浏览器中输入并按下回车时,浏览器会向服务器发送一个 HTTP 请求,并接收服务器返回的网页内容。HTTPS(HTTP Secure)是在 HTTP 协议上加入 SSL/TLS 加密层,用以保护数据传输的安全性。它保障数据在传输过程中不被窃听、篡改或伪造,并提供服务器身份验证机制。
2025-04-11 09:04:21
834
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人