- 博客(23)
- 收藏
- 关注
原创 深入Java底层:线程池全面解析
线程池(Thread Pool)是一种多线程处理形式,它预先创建一组线程并管理它们的生命周期,当有任务到来时,从池中分配一个空闲线程来执行任务,任务完成后线程返回池中等待下一次分配,而不是直接销毁。这种机制避免了频繁创建和销毁线程的开销,提高了系统性能。线程池是Java并发编程中的重要组件,JDK1.8中的ThreadPoolExecutor提供了灵活而强大的线程池实现。理解其内部工作原理、状态机设计、任务调度流程等底层机制,有助于我们更好地使用和调优线程池。
2025-08-13 15:06:45
499
原创 深入Java底层剖析ThreadLocal机制
ThreadLocal是Java中一个特殊的工具类,它提供了线程局部变量。这些变量不同于普通的变量,因为每个访问该变量的线程都有自己独立初始化的变量副本,从而实现了线程间的数据隔离。ThreadLocal是Java中实现线程数据隔离的强大工具,正确使用可以避免同步带来的性能损耗,提高系统并发能力。但同时需要注意内存泄漏问题,遵循最佳实践来确保程序的健壮性。
2025-08-13 15:00:55
361
原创 面试八股之从Java到JVM层面深入解析ReentrantLock实现原理
ReentrantLock是Java并发包(java.util.concurrent.locks)中的一个重要组件,它是一个可重入的互斥锁,具有与synchronized关键字类似的功能,但提供了更灵活的锁操作。ReentrantLock是Java并发编程中的重要工具,它通过AQS框架实现了高效的可重入锁机制。从JVM层面看,它充分利用了CAS操作、volatile变量和线程调度机制,在保证线程安全的同时提供了良好的性能。
2025-08-12 14:43:33
317
原创 面试八股之从jvm层面深入解析Java中的synchronized关键字
是Java中最基本的同步机制,用于控制多个线程对共享资源的访问,确保同一时刻只有一个线程可以执行特定代码段或访问特定对象。它是Java内置的互斥锁实现,能够有效解决多线程环境下的原子性、可见性和有序性问题。关键字是Java并发编程的基础构建块,从JDK1.0开始就存在,经过多次优化(尤其是JDK1.6的锁升级机制)后,性能已经大幅提升。理解其JVM层面的实现原理,有助于我们编写更高效、更安全的并发程序。在实际开发中,应根据具体场景选择合适的同步策略,对于简单同步需求,仍然是一个简单有效的选择;
2025-08-12 14:38:35
510
原创 Java中的CAS实现原理深度解析
CAS(Compare And Swap,比较并交换)是Java并发编程中的一种无锁原子操作技术,它是现代多核处理器提供的一种原子指令,也是Java并发包中许多高性能类(如AtomicInteger、ConcurrentHashMap等)的基础实现机制。CAS作为Java并发编程的核心机制,其实现涉及从Java代码到JVM再到CPU指令的多层协作。理解CAS的工作原理对于编写高性能并发程序至关重要。JDK 1.8在CAS的基础上进行了诸多优化,使得Java并发编程在高竞争环境下也能保持良好的性能表现。
2025-08-11 09:01:44
393
原创 深入理解乐观锁:原理、实现与应用详解
乐观锁(Optimistic Locking)是一种并发控制机制,它基于"乐观"的假设:认为数据在大多数情况下不会发生冲突,因此允许多个事务或线程同时访问数据,但在提交更新时会检查数据是否被其他事务修改过。与悲观锁(Pessimistic Locking)不同,乐观锁不会在数据访问时立即加锁,而是在数据更新时才进行冲突检测。这种机制特别适合读多写少的场景,能够显著提高系统的并发性能。乐观锁是一种高效的并发控制机制,特别适合读多写少的场景。
2025-08-11 08:57:48
1037
原创 深入理解悲观锁:原理、实现与应用
悲观锁(Pessimistic Locking)是一种并发控制机制,它基于一种"悲观"的假设:认为在多线程或多进程环境下,数据冲突是常态而非例外。因此,在访问数据前,悲观锁会先获取锁,确保在持有锁的期间内,其他线程无法修改数据,从而避免并发冲突。悲观锁的核心思想可以概括为:"宁可错杀一千,不可放过一个"。它在数据处理前就假设最坏的情况会发生,因此采取预防性的加锁措施。悲观锁是一种重要的并发控制机制,它通过预先加锁的方式确保数据一致性。
2025-08-10 10:18:02
787
原创 从JVM底层到Java内存模型深入理解Java中的volatile关键字
volatile是Java语言中的一个关键字,用于修饰变量,它提供了一种轻量级的同步机制,能够保证变量的可见性和有序性,但不保证原子性。与相比,volatile更加轻量,不会引起线程上下文的切换和调度,因此在某些场景下性能更好。volatile关键字是Java并发编程中的重要工具,它通过内存屏障和缓存一致性协议保证了变量的可见性和有序性。理解其底层实现原理有助于我们更合理地使用它来解决并发问题。但同时也要认识到它的局限性,在需要保证原子性的场景中,应该选择其他同步机制。
2025-08-10 10:06:08
366
原创 以示例详细讲解操作系统中的死锁
死锁(Deadlock)是操作系统中的一个经典问题,指在多进程或多线程环境中,两个或多个进程(线程)因为竞争系统资源或互相通信而陷入永久等待的状态,若无外力干预,这些进程都无法继续执行下去。死锁的正式定义:一组进程(线程)中的每一个都在等待仅由该组中其他进程才能引发的事件,那么该组进程就被称为死锁。死锁是多线程和分布式系统中的常见问题,理解其原理和避免方法对于开发稳定的系统至关重要。按照固定顺序获取锁使用超时机制避免无限等待尽量减少锁的作用范围和持有时间使用高级并发工具类。
2025-08-09 11:25:23
775
原创 操作系统中的上下文切换:原理与实现
上下文切换是指操作系统保存当前运行任务的状态(上下文),以便稍后可以恢复该任务,并加载下一个要运行任务的状态的过程。这种机制使得单个CPU能够通过快速切换来"同时"运行多个任务。上下文切换是操作系统实现多任务并发的关键技术,它通过在任务间快速切换来创造"同时运行"的假象。理解上下文切换的原理对于操作系统开发、性能调优和系统编程都至关重要。虽然上下文切换带来了一定的性能开销,但通过硬件支持、算法优化和智能调度,现代操作系统已经能够高效地管理这一过程。
2025-08-09 11:04:27
433
原创 深入Java底层探究线程生命周期与状态
Java线程生命周期模型是对操作系统线程状态的抽象和扩展,既考虑了跨平台性又提供了精确的状态控制。多线程程序调试死锁/活锁问题诊断线程池调优并发控制设计。
2025-08-08 21:00:12
578
原创 八股文之深入解析ConcurrentHashMap的线程安全实现机制
无锁读:volatile变量保证内存可见性CAS写:空桶插入等简单操作使用CAS细粒度锁:非空桶使用synchronized锁定头节点协助扩容:多线程协同完成扩容迁移分片计数:减少size统计的竞争树结构优化:红黑树使用特殊读写锁。
2025-08-08 20:52:16
513
原创 HashMap的八股背了,那HashSet的呢?
特性HashMapHashSet存储内容键值对单元素(实际只使用key)重复判定基于key的equals和hashCode基于元素的equals和hashCode空值支持允许1个null key和多个null value允许1个null元素迭代顺序不保证不保证性能消耗更高(需存储value)更低(value为固定对象)典型用途键值对关联存储去重集合操作。
2025-08-07 15:00:44
400
原创 面试八股之HashMap底层实现详解
HashMap是Java集合框架中最重要的数据结构之一,它基于哈希表实现,提供了高效的键值对存储和检索功能。在JDK1.8中,HashMap的实现经历了重大改进,提升了性能并解决了某些极端情况下的效率问题。特性JDK1.7及之前JDK1.8及之后数据结构数组+链表数组+链表+红黑树插入方式头插法尾插法哈希冲突解决纯链表链表长度>8转红黑树,<6转回链表多线程安全性可能产生环形链表仍非线程安全但不会产生环形链表查询效率O(n)最坏情况O(logn)最坏情况扩容机制。
2025-08-07 14:46:14
381
原创 ArrayList与LinkedList插入删除操作时间复杂度深度对比
在Java集合框架中,ArrayList和LinkedList是最常用的两种List实现。它们虽然都实现了List接口,但在底层数据结构和操作性能上有着显著差异。本文将深入分析这两种数据结构在插入和删除操作时的时间复杂度,并基于JDK 1.8源码进行详细解读。操作类型ArrayList 时间复杂度LinkedList 时间复杂度说明尾部插入(add)平均O(1),最坏O(n)O(1)ArrayList扩容时需要复制数组头部插入O(n)O(1)ArrayList需要移动所有元素。
2025-08-07 10:29:37
446
原创 你真的了解ArrayList 与 Array(数组)的区别吗?
Java提供了两种主要的方式来存储一组数据:传统的数组(Array)和ArrayList。对于性能关键且大小固定的原始类型数据,数组是更好的选择。ArrayList是Java集合框架的一部分,它实现了List接口,基于动态数组实现,可以根据需要自动调整容量。通常数组的访问速度略快于ArrayList,因为ArrayList有额外的方法调用开销。数组是Java中最基本的数据结构之一,它是一个固定长度的容器,可以存储相同类型的元素。的大小在创建时就固定了,无法动态改变。的大小是动态的,会根据需要自动增长。
2025-08-07 08:39:10
811
原创 面试深入解析JDK1.8中的泛型:使用方式与项目实践
泛型是Java 5引入的核心语言特性,在JDK1.8中得到了全面支持和增强。泛型实现了参数化类型的概念,使代码能够在不指定具体类型的情况下工作,同时保证了类型安全。类型安全:编译时检查类型错误代码复用:一套代码可适用于多种类型消除强制转换:减少运行时ClassCastException风险// 分页结果泛型封装// 构造器、getter/setter省略// 泛型静态工厂方法// 使用示例。
2025-08-06 11:31:37
334
原创 面试深入解析Java字符串常量池:从理论到实践
字符串常量池是Java虚拟机(JVM)中一块特殊的内存区域,用于存储字符串字面量。它的主要目的是减少重复字符串对象的内存占用,提高程序性能。优先使用字面量方式创建字符串避免在循环中使用+拼接字符串,改用StringBuilder谨慎使用intern(),只有在确实需要减少内存占用时才使用理解字符串不可变性,避免不必要的字符串操作注意编译期优化,如常量折叠(Constant Folding)在实际开发中,应当根据具体场景选择合适的字符串处理方式,平衡内存使用和性能需求。
2025-08-06 11:21:07
407
原创 Java面试字符串处理三剑客:String、StringBuffer与StringBuilder深度解析(基于JDK1.8)
String不可变,线程安全适合字符串常量和不频繁修改的场景性能最差但使用最简单可变,线程安全适合多线程环境下的字符串构建性能中等,有同步开销可变,非线程安全适合单线程环境下的字符串构建性能最佳在实际开发中,应根据具体需求选择合适的字符串类。优先考虑线程安全需求在单线程中总是首选StringBuilder避免在循环中使用String进行拼接对于已知长度的构建,设置合理的初始容量通过合理选择字符串处理类,可以显著提高Java应用程序的性能和内存使用效率。
2025-08-06 11:06:05
1230
原创 数据库如何处理大数据量的水平分库分表
摘要:分库分表规则建议按频繁查询字段取模分表以避免跨表查询,或按连续ID范围分表。表迁移可采用停服迁移(保证一致性但影响服务)或双写模式(同时写入新旧表,通过定时任务校验数据一致性)。双写需注意新表负载,并处理迁移过程中的数据同步问题。
2025-08-06 10:06:25
180
原创 MYSQL可重复读的实现
MVCC通过UndoLog版本链和Read-View实现事务隔离。每条数据记录包含事务ID(trx_id)和回滚指针(roll_pointer),更新时生成新版本并链接到UndoLog。Read-View通过四个字段(m_ids数组、min_trx_id、max_trx_id、create_trx_id)判断数据可见性:若事务ID小于最小未提交ID则可见,若大于最大ID则不可见,否则检查是否在未提交事务列表中。
2025-08-06 10:05:31
181
原创 GateWay 分发WebSocket 报错
查了很多资料,都叫我去除依赖,但是去一个就报错一个,后面看到有大佬在评论区说用这个,真的有效。网关依赖就只有这个,但是webSocket连接的时候给我报错。
2025-01-01 21:30:24
506
1
原创 Microsoft edge卡顿
查看edge cpu占用的时候莫名发现开个标签页就彪40%多的cpu。笔者最近使用edge的时候,在渲染页面时卡顿,在新开标签的时候卡顿。但是暂时没有根治的方法,需要等惠普官方补坑。因为这个进程的原因,结束这个进程就可以。在百度无果后换了google浏览器。今天偶然刷到bilibili看到了。
2023-04-05 18:05:17
395
1
老人桌面APP flutter开发 目前已测试机型为REDMI note 10pro
2025-08-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人