- 博客(67)
- 收藏
- 关注
原创 NAT 机制
摘要:NAT(网络地址转换)技术通过将私有IP地址转换为公有IP地址,解决了IPv4地址不足的问题。私有IP地址(如192.168.x.x)仅在局域网内使用,而公有IP地址是全球唯一的。NAT路由器通过建立映射表,实现内外网地址转换,使多个设备共享一个公有IP访问互联网。该过程对终端设备透明,有效缓解了IPv4地址短缺问题。
2026-02-11 13:28:08
872
原创 网络之数据链路层
数据链路层是OSI模型的第二层,负责同一物理网络内相邻节点间的可靠数据传输。主流协议包括以太网(有线局域网)、Wi-Fi(无线)、PPP/PPPoE(宽带拨号)等。以太网协议作为核心协议,采用包含源/目的MAC地址(48位硬件标识符)的帧格式,通过MAC地址实现局域网内设备识别和寻址。MTU(最大传输单元)限制单次传输数据量,以太网默认1500字节,超出的IP数据包需分片传输。值得注意的是,端到端通信中IP地址保持不变,而MAC地址会在每跳链路中更新。
2026-02-11 10:27:38
825
原创 如何基于UDP实现可靠传输
摘要:UDP作为无连接协议缺乏可靠性保证,但可通过应用层机制实现可靠传输。关键技术包括:1)序列号检测丢包乱序;2)ACK/NACK确认机制;3)超时重传与RTT动态调整;4)滑动窗口流量控制;5)数据包排序去重;6)增强校验;7)可选拥塞控制。这种方案兼顾UDP低延迟优势与可靠传输需求,适用于音视频、游戏等场景,但需权衡实现复杂度与性能需求,避免简单复刻TCP。关键优势在于可定制化可靠性级别和更好的NAT穿透能力。
2026-02-10 10:48:28
273
原创 IP 协议的相关特性
IP协议是TCP/IP协议族的核心协议,负责数据包的寻址和路由。主要特性包括:IPv4头部20-60字节,包含版本、长度、服务类型等字段;IPv6简化头部为40字节。IP协议是无连接的,每个数据包独立处理;不可靠,依赖上层协议保证可靠性;尽力而为交付。支持异构网络互联,使用IP地址逻辑寻址,具备分片重组能力。IPv4使用32位地址,IPv6扩展为128位。支持单播、广播(仅IPv4)和组播通信方式。
2026-02-10 09:56:36
673
原创 TCP协议的相关特性
TCP是互联网核心协议,提供面向连接、可靠的字节流传输服务。通过三次握手建立连接、四次挥手释放连接,确保通信可靠性。采用校验和、序列号、确认应答等机制保障数据准确传输,支持全双工通信。数据通过内核缓冲区管理,实现灵活的读写操作,不受单次读写大小的限制,体现其面向字节流的特性。
2026-02-09 14:13:29
229
原创 深入理解 TCP 的滑动窗口、快速重传、流量控制和拥塞控制机制
摘要:TCP滑动窗口机制通过允许发送方在未收到ACK确认前连续发送多个数据段,显著提升了传输效率。窗口大小由接收窗口(接收方缓冲区容量)和拥塞窗口(网络状况)共同决定,采用流量控制和拥塞控制动态调整。其中,慢启动机制初期指数增长窗口大小,达到阈值后转为线性增长;快重传机制在丢包时快速重传丢失数据段。该机制通过累计确认、窗口滑动和动态调整,实现了高效可靠的TCP数据传输。
2026-02-09 10:09:44
1239
1
原创 深入理解 TCP 确认应答和超时重传机制
摘要:TCP的确认应答机制通过序列号、确认号和ACK标志位实现可靠传输。发送方为每个字节分配序列号,接收方通过ACK报文确认已接收数据。若未收到ACK,发送方会触发超时重传机制。接收缓冲区通过序列号识别重复数据,并按序提供给应用程序,确保数据不重复、不丢失。该机制解决了网络传输中的数据包丢失和ACK丢失问题,保证传输可靠性。
2026-02-07 14:27:21
809
原创 深入理解 TCP 三次握手与四次挥手
TCP连接管理采用三次握手建立连接和四次挥手终止连接。三次握手通过SYN和ACK标志位交换初始序列号,验证双方通信能力:客户端发送SYN→服务器回复SYN+ACK→客户端确认ACK。四次挥手确保可靠断开:主动方发送FIN→被动方ACK→被动方发送FIN→主动方ACK确认。关键点包括:1)三次握手防止历史连接问题;2)四次挥手处理半关闭状态;3)TIME_WAIT状态确保最后ACK可靠传输。整个过程通过序列号同步和状态转换实现可靠连接管理。
2026-02-06 21:25:15
578
原创 UDP 的报文结构和注意事项
UDP报文格式包含8字节固定头部,由源端口、目的端口、长度和校验和四个16位字段组成。UDP是无连接、不可靠的协议,不保证数据送达且无重传机制。编程时需注意:报文大小建议≤1472字节避免IP分片;接收缓冲区必须足够大并检查实际接收长度;DatagramSocket存在线程安全问题;应设置超时避免阻塞;及时关闭资源防止端口占用。在IPv4中校验和可选,IPv6中必须使用。
2026-02-04 21:53:33
702
原创 Java算法之双指针的运用场景
Java双指针算法技巧主要包括三种类型:1.对撞指针(相向移动,用于有序数组查找问题);2.快慢指针(同向移动不同速度,用于链表问题);3.滑动窗口(动态调整窗口大小,解决子串/子数组问题)。典型应用包括两数之和、链表判环、最小子数组等。优势在于时间复杂度可优化至O(n),空间复杂度O(1)。使用时需注意数组有序性、空指针异常及窗口条件设置。该技巧能高效解决线性数据结构问题,代码简洁清晰。
2026-01-16 16:50:13
377
原创 抽象类和接口的区别
本文对比了Java中接口(Interface)与抽象类(AbstractClass)的8个核心区别。主要差异包括:抽象类使用abstract class定义,支持单继承,可包含实例字段和构造器,体现"is-a"关系;接口使用interface定义,允许多实现,仅包含常量,体现"can-do"能力。抽象类适合共享代码和状态,接口适合定义跨类能力。建议优先使用接口定义能力,仅在需要共享状态或实现模板方法时使用抽象类,并考虑组合优于继承。二者可结合使用,如Shape抽象类实
2025-12-27 15:45:53
1327
原创 继承存在的意义、特点、使用方法
本文系统介绍了Java中继承与接口的核心概念及应用。继承主要用于代码复用、建立"is-a"关系和实现多态,通过父类共享字段和方法,避免重复代码。接口则定义行为契约,支持多实现、默认方法等特性,能够表达"can-do"能力。接口的使用包括定义、实现、多态调用及高级用法如Lambda表达式和接口继承。继承与接口相互补充,继承侧重类型层次,接口强调行为规范,二者共同构建了Java面向对象编程的基石。
2025-12-27 15:34:45
829
原创 Java抽象类特点、使用方式和应用场景
Java抽象类是一种介于普通类和接口之间的特殊类,它通过abstract关键字声明,既包含抽象方法(强制子类实现)也允许包含具体方法(提供代码复用)。抽象类的主要特点包括:不能被直接实例化、支持单继承、可以包含成员变量和构造器。其核心价值在于解决"部分实现+强制继承"的需求,为子类提供通用模板,同时强制规范子类行为。抽象类常用于实现模板方法模式,构建有状态的类层次结构,并与接口形成互补,完善面向对象编程能力。通过向上转型和向下转型,抽象类支持多态特性,既能统一处理不同子类,又能访问子类特
2025-12-27 10:15:08
832
原创 Java 中 this 关键字的使用场景
Java中this关键字的用法总结:1.区分成员变量与局部变量(最常见用法);2.调用当前类其他构造器(必须为首条语句);3.返回当前对象引用(支持链式调用);4.将当前对象作为参数传递;5.在内部类中引用外部类实例。注意事项:不能在静态上下文中使用,构造器中this()必须为首条语句且不能与super()共存。合理使用this能提高代码可读性和灵活性。
2025-12-24 20:38:47
688
原创 volatile 的作用
摘要:本文探讨了volatile关键字在单例模式中的双重作用:保证内存可见性和禁止指令重排序。通过分析DCL(双重检查锁定)单例实现,指出若无volatile修饰,JVM可能对对象创建的三个步骤(分配内存、初始化、赋值)进行重排序,导致多线程环境下返回未完全初始化的对象。重点阐述了volatile如何通过禁止重排序和保证可见性来确保线程安全,并警告去除volatile可能引发难以复现但严重的并发问题(如Heisenbug)。该机制自Java5起成为实现线程安全单例模式的关键保障。
2025-12-20 21:33:29
346
原创 Volatile 解决内存可见性问题
这段代码存在一个典型的 Java 多线程可见性问题,会导致 线程t1无法看到t2对flag的修改,从而陷入死循环。
2025-12-20 20:14:35
407
原创 Java 多线程标志位的使用
必须保证内存可见性问题:一个线程修改标志位,另一个线程可能永远看不到更新。原因:CPU 缓存、JVM 优化导致变量值未同步到主内存。
2025-12-20 19:11:55
849
原创 字节流与字符流读写
即 8 位二进制数。:它不管你读的是什么文件(是图片、视频还是文本),它都把内容当成一串来搬运。读取的就是纯粹的字节。如果你用打印,看到的是内存中的真实二进制数据。:所有类型的文件(万能)。
2025-12-20 10:47:20
546
原创 HashTable、HashMap、ConcurrentHashMap 之间的区别
简单记忆要线程安全且高并发 →单线程 →HashMap避免使用HashTable(历史遗留,性能差)
2025-12-16 21:14:58
161
原创 ReentrantLock 与 synchronized 的区别
Java 中的和都是用于实现线程同步的机制,但它们在功能、使用方式和性能等方面存在显著差异。
2025-12-16 20:24:58
260
原创 锁策略、CAS 机制以及 synchronized 优化过程
如果持有锁的线程很快释放,自旋线程就能立即获取,避免了阻塞/唤醒的开销。如果一系列连续的操作都在对同一个对象加锁(如循环内加锁),JVM 会将锁的范围扩大(粗化),变成一次加锁解锁,减少频繁申请释放锁的开销。“谁抢到是谁的”:允许插队,吞吐量高,但可能导致线程饥饿。如果自旋次数超过阈值(或等待线程过多),JVM 会将轻量级锁膨胀为重量级锁,此时未获取到锁的线程会被挂起。它偏向于第一个访问的线程,如果没有竞争,该线程以后每次进入同步块都不需要做任何同步操作。“先来后到”:线程获取锁的顺序严格按照申请的顺序。
2025-12-09 21:46:40
688
原创 synchronized
每次退出同步块时,计数器递减。当一个线程获取到锁后,其他试图获取同一把锁的线程会被阻塞,直到持有锁的线程释放锁。新来的线程和队列中等待的线程有同等的概率竞争到锁,这可能导致某些线程长时间无法获取锁(饥饿),但整体吞吐量通常比公平锁更高。在轻量级锁状态下,如果线程获取锁失败,它不会立即挂起(阻塞),而是会执行一段忙循环(自旋),看持有锁的线程是否很快就会释放。如果锁对象只有一个线程访问,JVM 会将锁“偏向”该线程,线程再次进入时不需要进行任何同步操作(CAS),直接通过检查对象头中的线程 ID 即可。
2025-12-09 21:06:51
990
原创 Java线程池
Java线程池是一种,它通过复用已创建的线程来执行多个任务,而不是为每个任务都新建一个线程。Java线程池的工作原理是其高效管理并发任务的核心,其本质是一个基于和的复杂调度系统。其工作流程可以概括为:任务提交后,线程池根据当前状态(核心线程数、队列容量、最大线程数)决定是创建新线程执行、放入队列缓冲,还是直接拒绝。
2025-12-09 20:30:14
1318
原创 Java 线程的几种状态
主要进入条件:调用 Thread.sleep(long)、 Object.wait(long)、Thread.join(long) 或 LockSupport.parkNanos() 等带超时参数的方法。主要进入条件:调用 Object.wait()(无参)、Thread.join()(无参) 或 LockSupport.park()主要退出条件:被其他线程通过 notify() / notifyAll() 唤醒 或 被中断 -> RUNNABLE。主要进入条件:start() 方法被调用;
2025-11-17 16:16:18
317
原创 Java 不同创建线程的方式什么时候才可以使用 this 来获取线程的引用
3. lambda 表达式也不可以,因为 lambda 表达式中的 this 指向外部类实例是有 lambda 的设计哲学和实现机制来决定的。因为匿名类继承了 Thread 类,所有它具有 Thread 的所有方法,包括 getName().所以需要 Thread.currentThread()来获取当前正在执行代码的线程对象。2.实现 Runnale ,不能用 this 来获取线程信息。1.匿名内部类可以使用 this 来获取当前线程的引用。this 的指向规则。运行时有两个独立对象。
2025-11-11 22:09:41
173
原创 匿名内部类与外部类有什么区别
匿名内部类是一种特殊的内部类,它与常规的外部类(包括顶级类和命名内部类)有显著区别。匿名内部类:定义和实例化同时完成,没有独立的类声明。可以访问外部类的所有成员(包括 private)代码紧凑:简单实现可以写在调用点附近,提高可读性。外部类/命名内部类:先定义类结构,再实例化。快速原型:临时性的、一次性的实现非常方便。可维护性:复杂逻辑有独立的类文件结构清晰。可复用性:可以在多个地方实例化和使用。继承体系:可以建立完整的类层次结构。何时使用命名类(外部类/内部类)1.匿名内部类的定义方式与语法。
2025-11-11 20:55:09
339
原创 进程与线程的区别
线程共享其所属进程的地址空间和资源(如全局变量、打开的文件)。创建或销毁一个线程,由于它们共享进程的绝大部分资源,只需分配少许独立的栈空间和寄存器即可,开销很小,速度非常快。进程像一个独立的公司,它拥有自己独立的“财产”,如内存空间(代码段、数据段、堆、栈)、文件描述符、I/O设备等。公司里的“办公空间”(进程的资源),但每个员工有自己的“工作任务流”(独立的程序计数器、栈空间和寄存器状态)。创建或销毁一个进程,需要为其分配或回收独立的内存空间、文件资源等,这涉及大量的系统调用和操作,开销较大,速度较慢。
2025-11-06 16:11:44
220
原创 事务的隔离级别及其存在的相应的问题
事务的隔离级别有:1、READ UNCOMMITTED --> 读未提交由于在读取数据时不做任何限制所以并发性能很高,但是会出现⼤量的数据安全问题,比如在事务A中执行了⼀条 INSERT 语句,在没有执行 COMMIT 的情况下,会在事务B中被读取到,此时如果事务A执行回滚操作,那么事务B中读取到事务 A写入的数据将没有意义,我们把这个理象叫做 "脏读"。2、READ COMMITED --> 读已提交与不可提交。
2025-10-26 09:23:04
336
原创 索引什么时候会失效
8.针对复合查询,其中 a,b,c 为复合索引,查询时,可以按照 a、a,b、a,b,c、a,c、b,c 其他的不行,得有一定顺序。4.查询条件中包含了 or , or 一边是索引列的条件,另一边是非索引列的条件,还是会一条一条的遍历。2.查询的时候,使用了索引列作为条件,但是索引列的值比较单一,此时索引无法发挥效果。给一个表创建索引时,不是所有的查询都能通过索引来完成,以下来分析索引失效的情况。3.查询的时候,查询条件针对索引列进行了表达式运算或对索引列进行了隐式类型转换。如果是 and 则没事。
2025-10-19 15:48:25
140
原创 MySQL 之索引为什么选择B+树
1.哈希表:哈希表搜索的时间复杂度是 O(1),查询速度也快,但是哈希表通过哈希函数将键映射到存储位置,但该过程不保证数据的物理存储顺序与键的逻辑顺序一致。3.红黑树:虽然是平衡或近似平衡的,但是毕竟是二叉结构,在检索数据时,由于表中的数据都是存在磁盘中的,所以每次范围某个节点的子节点时都会发生一次磁盘IO(磁盘I/O(Input/Output)指计算机系统中磁盘的输入输出操作,包括从磁盘读取数据(输出)和向磁盘写入数据(输入),是数据存储与传输的核心过程,直接影响系统性能)。但是不是最佳的结构。
2025-10-19 14:48:04
351
原创 树与二叉树
数据的线性存储结构有哪种,结构有几种什么是树什么不是树什么是结点的度什么是树的度什么是叶子结点或终端结点什么是双亲结点或父结点什么是孩子结点或子结点什么是根结点什么是结点的层度什么是树的高度或深度什么是非终端结点或分支结点什么是兄弟结点什么是堂兄弟结点什么是结点的祖先什么是子孙什么是森林。
2025-08-12 22:06:16
917
原创 Java 队列
Queue 中的 add 与 offer 的区别。offer、poll、peek 的模拟实现。Queue 和 Deque 有什么区别。数据入队列时一定是从尾部插入吗。数据出队列时一定是从头部删除吗。数据入队列时一定是从尾部插入吗。数据出队列时一定是从头部删除吗。熟悉 Deque 接口的方法。队列一般用什么哪种结构实现。队列是用哪种结构实现的。Queue 接口的方法。如何利用顺序表实现队列。队列的基本运算有什么。如何利用链表实现队列。队列的基本运算有什么。
2025-07-29 21:00:25
226
原创 数据结构之顺序表&链表&栈
什么是 listlist 的使用线性表是什么顺序表是什么顺序表和线性表的关系顺序表和数组的区别List 和 ArrayList 的关系如何自己模拟实现 myArrayListArrayList 的构造ArrayList 的常见方法以下两种写法有什么区别AraryList 的遍历的代码实现(6种)iterator 方法的使用方法及原理为什么 AraryList 、List 、Collection 、 Iterable 接口中都有 iterator 方法。
2025-07-28 20:10:01
840
原创 复杂度+包装类型+泛型
本文摘要介绍了Java集合框架、数据结构、算法及复杂度分析等核心概念。重点讲解了包装类的装箱/拆箱机制(自动装箱范围为-128~127)、泛型的实现原理(类型擦除和桥接方法)及使用(上界通配符)。详细说明了List接口与ArrayList实现类的关系,包括顺序表实现原理及构造方法。通过代码示例展示了泛型类的设计(如求数组最大值)和使用注意事项(包装类不能直接比较)。最后比较了ArrayList<Integer>与List<Integer>两种声明方式的接口编程差异。
2025-07-20 19:46:26
993
原创 Java 之异常
自定义异常的使用场景自定义异常需要继承 Exception 或者 RuntimeException继承 Exception 、RuntimeException分别表示什么如何实现自定义异常(如何定义运行时异常与编译时异常)如果定义的是运行时异常,需要声明吗可以实现构造方法,并同时传参进行信息交互throw 后面可以加 return 吗。
2025-07-14 10:20:46
418
原创 Java 之字符串 --- String 类
String 类型属于哪种类String 是被 publid final 修饰的类String 提供的构造方法什么叫做字符串常量池“池”的理解str1 用 ''=='' 与str2 比较时,比的是地址字符串的内存存储。
2025-07-12 21:32:47
703
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅