编程语言
文章平均质量分 94
java,python
TracyCoder123
人生是旷野,不是赛道。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JVM 内存模型全景解析
本文将带你深入 JVM 的运行时数据区(Runtime Data Areas),通过图解和代码示例,彻底搞懂 Java 内存的布局与运作。存储: boolean, byte, char, short, int, float, reference...这部分区域由所有线程共享,是 JVM 内存管理的重头戏,也是垃圾收集器(GC)主要工作的区域。掌握这些区域的职责与交互,能让你在面对复杂的并发问题和内存溢出故障时,做到心中有数,游刃有余。这部分内存区域的生命周期与线程相同,随线程而生,随线程而灭。原创 2026-01-18 20:21:52 · 749 阅读 · 0 评论 -
深入解析 Java BigDecimal
这个标准的设计目标是为了在有限的存储空间内表示尽可能大范围的数值,而不是为了保证绝对的精度。只有 64 位(其中 52 位用于存储尾数),它必须截断这个无限循环的二进制数。)来存储数值,并记录标度(scale,即小数点后的位数),从而完美解决了精度问题。在 Java 开发中,尤其是涉及到金融、电商、计费等对数字精度要求极高的场景时,是一个绕不开的核心类。在不同的金融场景下,需要不同的舍入策略。解析的是字符串字符,它能精确地知道你需要的是 “0.1”。或错误的构造方式,导致线上出现严重的金额计算事故。原创 2026-01-18 20:21:11 · 620 阅读 · 0 评论 -
Java String:从内存模型到不可变设计
字面量优于 new(利用常量池)(多余的堆对象)循环拼接禁止使用在循环体内,使用拼接字符串会导致编译器每次循环都创建一个新的对象,造成巨大的内存浪费和 GC 压力。正确做法:在循环外创建,在循环内调用append。// ❌ 错误示范i < 1000;i++) {// 每次都会 new StringBuilder() 和 new String()// ✅ 正确示范i < 1000;i++) {// 复用同一个对象内部的数组多线程环境如果是一个类的成员变量被多个线程并发修改,使用。原创 2026-01-17 18:30:25 · 976 阅读 · 0 评论 -
并发编程(五):ThreadLocal原理、内存泄漏与最佳实践
它能让每个线程拥有自己独立的变量副本,互不干扰。然而,ThreadLocal 也是一把“双刃剑”,如果理解不透彻,极易导致。本文将通过图解和源码,带你彻底搞懂 ThreadLocal 的底层结构及其“弱引用”设计的玄机。很多人误以为 ThreadLocal 是一个 Map,用来存储所有线程的数据。的静态内部类,它是一个类似 HashMap 的结构(但解决冲突用的是。JDK 的作者其实考虑到了这个问题。遵循“谁创建,谁销毁”的原则,使用。),其中存储的节点是。弱引用 (GC后断开)实际上,数据是存储在。原创 2026-01-17 18:29:29 · 927 阅读 · 0 评论 -
并发编程(四):深入浅出多线程与线程池
保证下层的实现只需关注一个执行任务的方法即可。原创 2026-01-16 09:35:00 · 686 阅读 · 0 评论 -
并发编程(三):深度解析Volatile 与 Java 内存模型 (JMM)
特性描述Volatile 是否支持可见性一个线程修改,其他线程立即可见✅ 支持有序性禁止指令重排序✅ 支持 (通过内存屏障)原子性复合操作不可分割❌ 不支持 (需用锁或原子类)最佳实践场景状态标志:如控制线程启停。双重检查锁定 (DCL):单例模式的安全实现。读多写少:结合 CAS 使用(如的底层实现)。原创 2026-01-16 09:34:24 · 864 阅读 · 0 评论 -
集合(四):LinkedHashMap深度解析——有序哈希与 LRU 缓存的基石
是 Java 集合框架中设计非常精妙的一个类,它展示了如何通过组合现有的数据结构(数组+链表)来满足复杂的业务需求。注意看,数据既存在于哈希桶中(垂直方向),也被一条双向链表(水平方向的红色虚线)串联起来。是“最近刚被使用”的元素。如何通过“双重结构”实现有序性,并展示如何利用其独有的机制,用短短几行代码实现一个。当你需要一个既能快速查找,又能保持插入顺序(或访问顺序)的容器时,,它并没有重写哈希算法,而是通过在原有哈希桶的基础上,维护了一条。哈希表 (数组 + 链表/红黑树): 保证 O(1) 查找。原创 2026-01-15 09:33:36 · 894 阅读 · 0 评论 -
集合(三):ArrayList 深度剖析——动态扩容与数据拷贝的艺术
它只复制了存储在数组中的引用地址,而没有复制引用指向的堆内存对象。这意味着,新老数组中的元素指向的是同一个对象。原创 2026-01-15 09:32:52 · 620 阅读 · 0 评论 -
集合(二):深度解析 ConcurrentHashMap——从分段锁到 CAS 的进化之路
当 Map 需要扩容时,不仅仅由发起扩容的线程独自完成,其他访问 Map 的线程如果发现正在扩容(遇到。在 JDK 1.7 和 JDK 1.8 中采用了截然不同的实现策略。如何通过锁粒度的细化、CAS 无锁算法以及协助扩容机制,实现高效的并发控制。数组 + 链表/红黑树的数据结构。锁的粒度细化到了数组的每一个。它在保证线程安全的同时,提供了极高的并发性能。它假设如果多个线程访问不同的数据段,它们就不会发生冲突。在高并发读写场景下,依然能保持接近线性的扩展能力。),会暂停手头工作,加入到扩容大军中。原创 2026-01-14 09:26:42 · 1091 阅读 · 0 评论 -
并发编程(二):Java原子类(Atomic Classes)全解析
关于CAS的原理可以看这篇:https://blog.csdn.net/Tracycoder/article/details/156860586?原创 2026-01-13 13:46:36 · 594 阅读 · 0 评论 -
并发编程(一):Java锁机制全景解析——从CAS、synchronized 到 Lock
假设有一个变量A,初始值为 1。线程 1准备修改变量,读取当前值为 1,然后被挂起(CPU 时间片耗尽)。线程 2抢占执行,将变量从 1 修改为 2。线程 2(或者线程 3)又将变量从 2 修改回 1。线程 1醒来,执行 CAS 操作。它发现内存值仍然是 1(符合预期),于是 CAS 成功执行。核心漏洞:虽然线程 1 操作成功了,但中间发生的“1 -> 2 -> 1”的过程被忽略了。对于简单的数值计算(如计数器)这可能无所谓,但在涉及对象引用、链表节点或状态机。原创 2026-01-13 13:38:05 · 999 阅读 · 0 评论 -
集合(一):HashMap 深度剖析——从 1.7 到 1.8 的进化之路
特性JDK 1.7JDK 1.8底层结构数组 + 链表数组 + 链表 +红黑树插入方式头插法(并发扩容可能死循环)尾插法(解决死循环问题)Hash 扰动扰动处理更复杂 (4次位运算+5次异或)简化 (1次位运算+1次异或)扩容计算全部重新 Rehash原位置 或 原位置+旧容量 (位运算优化)链表转树无链表长度 > 8 且 数组长度 > 64。原创 2026-01-12 17:47:17 · 1103 阅读 · 0 评论 -
IO编程:大白话讲Java NIO
如果把Java的I/O比作餐厅服务,BIO是“笨办法”(一对一盯桌),NIO是“聪明办法”(一个经理管所有桌)——核心就是。接下来用生活化的比喻+可视化图表,把NIO讲得明明白白。原创 2025-12-01 13:37:42 · 957 阅读 · 0 评论 -
Java 8 革命:Lambda 表达式与 Stream 流式编程详解
API,它提供了一种新的处理数据的方式,尤其适合于集合操作。流API的设计目的是为了更高效地处理数据集,尤其是当数据集很大时。它支持函数式编程风格,并且可以很容易地并行化。Lambda 表达式是 Java 8 引入的一个重要特性,它使得代码更加简洁、易于理解和维护。Lambda 表达式允许你把功能作为方法的参数,这极大地简化了函数式接口的使用。下面通过一些具体的例子来说明如何使用Stream API结合Lambda表达式。接下来,我们将通过几个具体的示例来展示如何使用 Lambda 表达式。原创 2024-08-20 11:46:56 · 1306 阅读 · 0 评论 -
走近Python爬虫(二):常见反爬虫机制的应对措施
AJAX是Asynchronous JavaScript And XML的首字母缩写,意为异步JavaScript与XML。使用AJAX技术,可以在不刷新网页的情况下更新网页数据。使用AJAX技术的网页,一般会使用HTML编写网页的框架。在打开网页的时候,首先加载的是这个框架。剩下的部分将会在框架加载完成以后再通过JavaScript从后台加载。网页上面存在的某些文字,在源代码中却不存在的情况,绝大部分都是使用了异步加载技术。原创 2023-12-25 16:17:55 · 2386 阅读 · 0 评论 -
走近Python爬虫(一):爬虫的作用和技术、获取网页内容、解析网页内容
然而,使用爬虫后,尽职调查变得更加便捷。目前,许多人专门利用爬虫参与活动并从中获利,这被称为"薅羊毛",而从事此类行为的人被称为"羊毛党"。关于获取网页,常用的是Python的两个第三方模块,一个是requests,另一个是爬虫框架Scrapy。一个页面最多也就几百KB,所以爬虫在爬取一个页面的时候,多出来的网速和从发起请求到得到源代码中间的时间都被浪费了。遇到各种反爬虫问题时,应该如何突破,如何隐藏爬虫,如何模拟人的行为,以及遇到没有见过的反爬虫策略时,应该如何思考及如何使用爬虫爬取非网页内容等。原创 2023-10-29 16:17:39 · 1830 阅读 · 0 评论
分享