- 博客(14)
- 收藏
- 关注
原创 从HashMap到ConcurrentHashMap的演进与优化
特性Hashtable锁粒度整个对象分段锁(16段)锁桶(头节点)读操作加锁加锁无锁(volatile)写操作全表锁分段锁锁桶扩容机制单线程全量迁移单线程全量迁移多线程协助迁移size 计算加锁分段计数,有一定并发CAS + CounterCell,高并发并发度116数组长度(理论数千)适用场景不推荐使用中等并发场景高并发场景(首选)从HashMap的单线程优化,到Hashtable的简单同步,再到锁粒度不断细化:从全表锁 → 分段锁 → 锁桶读写并发成为可能。
2026-03-27 19:51:53
372
原创 Java多线程学习(八)
定时器核心优先级队列负责排序,扫描线程负责监控执行。手动实现时要注意用wait(time)替代sleep以提高效率。线程池核心7 大参数是核心考点,重点理解“正式工 -> 阻塞队列 -> 临时工 -> 拒绝策略”的扩容流程。阻塞队列:它是解耦生产与消费的关键,也是图片中提到的“单独封装成服务器(如 MQ)”的理论原型。
2026-03-25 15:00:00
452
原创 Java多线程学习(七)
相信大家都知道队列(Queue)。它是一种极其常见的数据结构,核心特点是FIFO(First In First Out,先进先出)。就像我们在食堂排队打饭,先排队的人先打到饭走人,后排队的人只能等前面的人处理完。在 Java 中,普通的队列(如LinkedList实现的Queue)在单线程环境下运行得很好,但在多线程的高并发场景下,它就显得“力不从心”了。虽然基于数组实现。必须在创建时指定容量(有界)。它内部使用一把全局锁来控制入队和出队,性能稳定,适合缓存空间有限的场景。基于链表实现。
2026-03-24 19:45:00
392
原创 Java多线程学习(六)
构造方法私有化:防止外部new。双重 if 判断:兼顾性能与安全。volatile 修饰:防止指令重排导致的“半成品”对象问题。
2026-03-22 19:21:24
259
原创 Java多线程学习(五)
在 Java 内存模型(JMM)中,每个线程都有自己的工作内存(Cache),而所有变量都存在主内存中。线程 A 修改了变量,可能只停留在自己的工作内存。线程 B 读取的还是旧的主内存数据。理解 Java 多线程的关键在于理解内存模型和锁的机制。volatile解决了“看得到”的问题,而与解决了“排队与协作”的问题。
2026-03-22 18:59:06
402
原创 Java多线程学习(四)
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。若无外力作用,它们都将无法推进下去。简单来说,线程 A 持有锁 1 等待锁 2,而线程 B 持有锁 2 等待锁 1。双方都在等对方释放资源,结果谁也动不了。
2026-03-21 19:33:11
215
原创 Java多线程学习(三)
在单线程环境下运行完全正常的代码,在多线程环境下执行却出现了 Bug,这就是线程安全问题。线程安全是并发编程的基石。通过 synchronized,我们牺牲了一定的执行效率(引入了阻塞),但换取了结果的正确性。下一篇我将整理死锁相关的内容!!!
2026-03-20 18:22:52
190
原创 Java多线程学习(一)
这将会是一系列文章,今天我们将开始第一篇,记录整理我学习的知识点,欢迎大家一起学习讨论。Java设计者提倡多线程操作,JVM把操作系统的多线程API进行充分封装,而多进程封装很粗糙,所以我们学习Java要重点关注多线程,这一篇主要了解一些概念。
2026-03-17 17:02:13
493
原创 Java 堆与优先级队列
总的来说,堆这种结构在 Java 开发中就像是一个“高效的守门员”:它不追求全体有序,只专注于以OlognO(\log n)Ologn的极低代价压榨出最值。当你面对海量数据监控、定时任务调度(如Timer类的底层)或是像 Top-K 这种经典的性能瓶颈场景时,往往是比更聪明的选择。但在使用时也要留个心眼,记住它那“父子有序、兄弟乱序”的脾气,以及非线程安全的局限性。如果需要全序排列,隔壁的TreeMap或许更适合你,但论起处理流式数据的快准狠,堆依然是数据结构里的不二之选。
2026-03-16 19:15:13
971
原创 OJ题:二叉树的最近公共祖先问题
基本概念:简述LCALCALCA的定义(两个节点ppp和qqq向上追溯,第一次交汇的节点)。场景引入:为什么这个问题在面试和实际算法中如此重要(如家谱树寻亲、组织架构分析)。核心痛点:在复杂的二叉树结构中,如何高效地“自底向上”传递寻找结果?通过“计数法”解决 LCA 问题,最大的魅力在于它将复杂的路径追踪转化成了简单的状态累加。这种“自底向上”的信息传递思想,不仅能解决最近公共祖先问题,也是解决许多复杂树形 DP(动态规划)问题的基石。
2026-03-14 18:06:27
559
原创 用数组模拟实现队列基本操作
队列(Queue)作为一种经典的线性表,核心特性是“先进先出”(FIFO)。在 Java 中,我们常用 Queue queue1 = new LinkedList<>();这种基于链表的方式来实例化队列,其优点是容量不限、插入灵活。然而,为了更深入地理解底层内存分配与空间复用的原理,利用数组模拟实现队列是每一位开发者必经的进阶之路。
2026-03-12 19:59:57
396
原创 二叉树的四种遍历与二叉树还原
在数据结构的面试与实战中,二叉树(Binary Tree) 永远是绕不开的核心。它既不像数组、链表那样线性直观,也不像图论那样错综复杂,它是许多高级算法(如堆排序、平衡树、红黑树)的基石。理解二叉树,最基本的功法就是遍历。很多人能熟练写出递归版本,但在面对迭代(非递归)实现或是“如何根据遍历结果还原一棵树”时,往往会感到逻辑模糊。深度优先搜索(DFS):前序、中序、后序的三种递归与迭代实现。广度优先搜索(BFS):层序遍历的优雅实现。逻辑逆推:如何利用遍历序列间的物理联系,完美还原出一棵二叉树。
2026-03-11 20:09:01
394
原创 用Java语言实现栈和队列
本文介绍了使用链表实现栈和队列的Java实现方法。栈采用"后进先出"(LIFO)原则,仅在链表头部进行插入(push)和删除(pop)操作;队列遵循"先进先出"(FIFO)原则,在尾部插入(enqueue)而在头部删除(dequeue)。两种数据结构都通过内部Node类实现,栈只需维护top指针,队列则需要first和last两个指针以保证O(1)时间复杂度。栈适用于需要回溯的场景,队列适合排队处理的场景。手写实现有助于深入理解指针操作和内存管理原理。
2026-03-10 19:39:47
644
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅