- 博客(32)
- 收藏
- 关注
原创 ThreadLocal
ThreadLocal是Java的线程本地存储机制,通过为每个线程创建变量副本来实现线程隔离,避免数据竞争。其核心实现依赖于Thread内部的ThreadLocalMap,以ThreadLocal为弱引用键存储值。优点包括线程安全、减少锁竞争和简化参数传递,但存在内存泄漏风险,需调用remove()清理。适用场景包括线程封闭(如SimpleDateFormat)、跨方法传参和性能优化。最佳实践建议使用private static final修饰ThreadLocal,避免实例重复创建。注意ThreadLoc
2025-07-10 23:33:20
318
原创 零拷贝 (Zero-copy)
零拷贝技术通过减少数据复制和上下文切换提升系统性能,特别适用于大文件传输等场景。传统方式需要4次数据拷贝(2次CPU+2次DMA)和4次上下文切换,数据需经过用户空间。零拷贝技术(如Linux的sendfile或Java NIO的transferTo)仅需2次DMA拷贝和2次上下文切换,数据直接从内核缓冲区传输到目标设备,无需经过用户空间。Java程序可通过NIO实现零拷贝,相比传统IO方式显著提升传输效率。该技术广泛应用于文件下载、网络通信等高吞吐场景。
2025-07-10 18:12:17
970
原创 Redisson 的分布式锁
Redisson分布式锁基于Redis实现,提供原子操作、可重入设计、自动续期等核心机制。通过Lua脚本确保加锁原子性,使用Hash结构记录锁持有者和重入次数。锁获取失败时采用自旋等待和发布订阅机制减少无效轮询。看门狗机制自动续期默认30秒的锁(10秒检测一次)保障长事务执行,也可指定固定过期时间。解锁时递减重入次数,归零后删除锁并发布解锁消息。该设计兼顾性能与安全性,但需注意死循环导致锁永久占用的风险。
2025-07-10 15:57:37
1284
原创 MySQL 主从复制(Replication)
MySQL主从复制通过二进制日志实现异步数据同步。主库记录数据变更到binlog,由binlog dump线程发送给从库。从库的I/O线程接收binlog并写入relaylog,SQL线程执行relaylog中的SQL语句更新数据。整个过程异步进行,通过日志传递与重放实现数据冗余和读扩展,核心组件包括binlog、relaylog及I/O/SQL线程。
2025-07-10 15:00:12
215
原创 String, StringBuilder 和 StringBuffer 的区别
摘要:Java字符串处理类对比:String不可变,每次修改生成新对象效率低;StringBuilder可变且高效,适合单线程;StringBuffer同样可变但线程安全,适合多线程环境。StringBuffer通过synchronized方法确保线程安全,内部使用动态扩容的字符数组实现高效修改。String适用于常量或少量修改,StringBuilder适合单线程频繁操作,StringBuffer用于多线程场景。
2025-07-09 00:15:29
305
原创 常用设计模式
本文介绍了7种常见的设计模式实现:1)单例模式确保类唯一实例;2)工厂模式隐藏对象创建细节;3)抽象工厂模式创建产品族(如UI组件);4)建造者模式分步构建复杂对象;5)原型模式通过克隆创建对象;6)适配器模式转换接口兼容性;7)责任链模式传递请求处理。每种模式都配有简明代码示例,展示其核心实现方式和典型应用场景,包括单例的全局访问、工厂的对象创建封装、建造者的链式调用等特征实现。这些模式为解决特定软件设计问题提供了标准化方案。
2025-07-08 23:46:27
483
原创 java中父类和子类的成员变量可以重名吗
Java允许子类声明与父类同名的成员变量(字段隐藏),但需注意:1)子类和父类的同名变量独立存储;2)子类方法中默认访问子类变量,使用super可访问父类变量;3)字段访问不遵循多态,由引用类型决定访问哪个变量。示例显示,Parent obj访问父类变量,Child obj访问子类变量,子类方法中可通过super访问父类变量。
2025-07-08 21:26:37
291
原创 redis相关面试题
查询一个数据库中的数据。由于缓存中不会有该数据(未命中),导致每次请求都直接访问数据库,给数据库造成巨大压力,甚至压垮数据库。恶意攻击:攻击者故意构造大量不存在的ID进行查询。业务逻辑错误:程序BUG导致产生大量无效请求。即使数据库查询为空,也将这个空结果(比如null)进行短暂的缓存(设置一个较短的过期时间,如 1-5 分钟)。这样后续相同的无效请求在缓存过期前会命中空对象,保护数据库。优点:实现简单。缺点:1) 消耗额外的内存存储大量空值。
2025-06-22 23:21:31
1394
原创 Java事务失效(面试题)的常见场景
Spring AOP代理(CGLIB或JDK动态代理)默认无法拦截非public方法。事务基于AOP代理,自调用绕过代理直接调用目标方法。如MySQL的MyISAM引擎不支持事务。从其他Bean注入自身(通过。Spring事务信息存储在。事务管理器检测不到异常。中,新线程无法继承上下文。(需配置异步任务执行器)改用InnoDB引擎。由Spring代理实现。
2025-06-22 21:37:25
259
原创 索引覆盖和索引失效的场景
聚集索引结构(主键索引),一个表只能有一个聚集索引,可以指定非主键字段作为聚集索引,在MySQL中主键 = 聚集索引(如果没有显式主键,则会选择一个唯一非空索引作为聚集索引,否则 InnoDB 会自动生成一个隐藏的聚簇索引):就是查询的时候命中了非聚集索引,通过非聚集索引找到数据的主键值,再通过主键值找到聚集索引中所对应的整行数据,这个过程就是回表查询。是数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个,一般我们自己定义的索引就是非聚集索引。,直接从索引中获取所有需要的数据。
2025-06-21 14:49:30
881
原创 MySQL 慢 SQL 识别与优化
表示使用了非唯一索引。列,实际返回约 500 × 10% = 50 行。每次优化后必须重新执行 EXPLAIN 验证效果。:复杂查询使用 Elasticsearch。数据库分库分表:垂直拆分/水平拆分。预估扫描 500 行 → 结合。:使用 Redis 缓存热点数据。且扫描行数>1000,需优化。表示未使用索引 → 需优化。:写操作到主库,读操作到从库。:手动文件排序(需优化):存储引擎返回后再次过滤。:创建临时表(需优化):覆盖索引(好现象)
2025-06-20 17:31:00
677
原创 Java 并发编程:创建线程的 4 种方式
/ 创建自定义线程池4, // 核心线程数10, // 最大线程数60, // 空闲线程存活时间TimeUnit.SECONDS, // 时间单位new ArrayBlockingQueue<>(100), // 任务队列Executors.defaultThreadFactory(), // 线程工厂new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略// 提交任务i < 20;i++) {
2025-06-20 01:39:11
915
原创 面向对象与面向过程编程的区别
提取核心特征,忽略非必要细节实现方式:抽象类(abstract class)接口(interface)// 抽象类// 抽象方法(无实现)// 具体方法System.out.println("这是一个" + color + "的图形");// 具体类@Override。
2025-06-19 21:19:17
1322
原创 Java 中深拷贝与浅拷贝的区别
浅拷贝只复制了对象的基本数据类型值以及引用类型的地址,引用类型指向的对象并未被复制,因此原始对象和副本对象在引用类型上共享数据。深拷贝则是创建了一个全新的对象,包括对象内部所有引用类型的成员变量也创建了新的副本,这样原始对象和副本对象之间完全没有关联,修改一个不会影响另一个。
2025-06-19 18:40:11
426
原创 Java中==和equals()的区别?
比较项==运算符equals()方法基本类型比较值不适用(只能用于对象)引用类型比较对象地址默认比较地址,但通常被重写为比较内容可否被重写❌ 不可重写✅ 可以重写(推荐对自定义类也进行重写)安全性无需担心空指针异常调用前应确保对象不为 null,否则抛出 NullPointerException常见用途判断是否是同一个对象判断两个对象的内容是否逻辑上相等equals()如果你自己写的类希望支持有意义的equals()重写方法。(推荐)同时重写hashCode()
2025-06-19 18:13:31
398
原创 子网掩码是如何划分子网的
子网掩码(Subnet Mask)是用于划分网络中不同部分的重要概念,它帮助确定一个IP地址的哪一部分表示网络地址,哪一部分表示主机地址。简单来说,子网掩码通过与IP地址进行逻辑“与”运算来区分网络位和主机位。
2025-06-17 16:49:03
483
原创 python-使用协程监控任务排队时间和任务执行时间
客户端] --POST请求--> [FastAPI] --入队--> [asyncio.Queue][worker协程] 后续异步处理任务。└--> [立即返回响应]所有I/O操作使用异步库(aiohttp/aiofiles/asyncpg)调整工作协程数量(startup事件中的循环次数)控制并发度。:使用asyncio.wait_with实现执行超时控制。:通过后台协程每秒检查处于PENDING状态的任务。通过asyncio.Queue实现任务队列。使用3个工作协程并发处理任务。
2025-03-05 23:37:09
319
原创 静态变量,局部变量,成员变量的区别
在 Java 中,变量可以分为成员变量、局部变量和静态变量。它们之间的区别主要体现在声明位置、生命周期、作用域和存储位置等方面。下面详细说明这些变量的区别,并通过示例进行说明。
2024-06-24 23:40:19
521
原创 域名是如何分级的
域名系统是一个分层结构,主要包括顶级域名(TLD)、二级域名(SLD)、三级域名以及更低级别的域名。每个级别的域名从右到左依次排列,顶级域名在最右侧,依次向左扩展。虽然理论上可以有无限级别的域名,但实际应用中通常不会超过四到五级,以保持管理的简便性和可读性。
2024-06-19 23:48:09
3243
原创 一个域名可以绑定多个 IP 地址吗?一个 IP 地址也可以绑定多个域名吗?以及域名解析的过程
一个域名绑定多个 IP 地址:用于负载均衡和高可用性。一个 IP 地址绑定多个域名:通过虚拟主机和 DNS 配置实现,可以在同一服务器上托管多个网站。
2024-06-19 23:36:41
2439
原创 前后端加密通信:RSA与AES(GCM模式)的结合应用
1.选择合适的密钥长度:RSA和AES的密钥长度对安全性有很大影响。一般来说,RSA密钥长度建议选择2048位或更高,AES密钥长度建议选择128位、192位或256位。3.Cipher包生成的密文是带有tag的,而且也会校验tag;那也就意味着客户端传的密文也要带上tag,一般拼接在密文后。2.iv长度一般是96位12个(字节);tag长度为128位(16个字节)
2024-06-16 17:10:55
764
1
原创 还不会优先级队列(堆)?图解PriorityQueue
堆在逻辑上就是一颗完全二叉树,堆也正是保存在数组当中的,所以堆的保存方式就是将堆进行层序遍历然后存储在数组当中.
2022-05-02 15:07:41
768
原创 抽象类(abstract) 与 接口(interface)的区别?你又知道多少?
抽象方法是不能用关键字 private 和 final 修饰的;为了解决Java单继承问题,类可以实现多个接口,也能达成多继承的效果
2022-04-25 13:27:39
278
原创 java代码的执行顺序
java代码的执行顺序如下:开始 --> 父类的静态代码块 --> 子类的静态代码块 --> 父类的普通代码块 --> 父类的构造方法--> 子类的普通代码块 --> 子类的构造方法 --> 结束
2022-04-21 11:17:04
13189
8
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人