avatar
文章
224
标签
10
分类
10
首页
归档
标签
分类
关于
Logo技术博客
搜索
首页
归档
标签
分类
关于

技术博客

并发内功-代码线程安全分析步骤三之“Operation 查操作”
发表于2025-11-25|java|java
[并发内功] 代码线程安全分析步骤三之“Operation 查操作”前言绝大多数并发 Bug 的根源,不在于变量本身,而在于我们**“想当然”**地认为某些操作是瞬间完成的。 你写了一行代码 count++,觉得它是一气呵成的。但在 CPU 眼里,那是三条指令。当线程在这些指令的缝隙中切换时,灾难就发生了。 Step 3: Operation 专注于审视代码的逻辑动作,寻找**“竞态条件”(Race Condition)**。 ⚡️ 精华速查版:操作原子性红黑榜审查代码时,盯着那些针对共享变量的读写操作。不要被代码的行数迷惑,要看语义。 🕵️‍♂️ 操作类型 代码示例 判定结果 理由 🟢 单一读/写 flag = true; return x; ✅ 通常安全 基础类型的赋值和读取(非 long/double 64位机)通常是原子的。配合 volatile 可保安全。 🟢 原子类方法 atomic.incrementAndGet(); ✅ 安全 JDK 底层 CAS 保证原子性。 🔴 读-改-写 (RMW) i++; i =...
并发内功-代码线程安全分析步骤一之“State 找状态”
发表于2025-11-25|java|java
[并发内功] 代码线程安全分析步骤一之“State 找状态”前言很多开发者在排查线程安全问题时,习惯直接去找“有没有加锁”。其实,高手看代码的第一眼,看的不是锁,而是“变量”。 只要没有“共享的可变状态”,根本就不需要锁。如果连哪里有“鬼”(状态)都不知道,盲目加锁只会导致性能下降或死锁。 本文基于 S.E.O.P(State, Escape, Operation, Protection) 排查模型,带你攻克第一关:Step 1: State (找状态)。我们将通过 5 个典型案例,训练你“一眼识别危险代码”的本能。 ⚡️ 精华速查版:三色安全分级表在阅读详细分析前,请先死死记住这张**“变量红绿灯表”**。当你审查代码(Code Review)时,按此表对变量进行快速定级。 🚦 危险等级 典型特征 审查判定 应对策略 🟢 绝对安全 局部变量(定义在方法内) ✅ 栈封闭天生线程隔离,只要不传出去,绝对安全。 无需处理 🟢 绝对安全 Final 基础类型(final int, final double) ✅...
Flink Async I/O:原理与性能解密
发表于2025-11-25|大数据|大数据
前言在 Flink 流处理中,与外部系统(如 MySQL, HBase, Redis)交互往往是整个链路的性能瓶颈。很多开发者会有疑惑:网络 IO 耗时是物理固定的,异步到底是怎么“变快”的? 本文首先给出核心结论,随后深入底层原理。 🚀 精华速查:一分钟看懂 Async I/O如果你没时间看全文,记住以下核心逻辑: 1. 核心原理:时间重叠 (Time Overlap)Flink Async I/O 提高吞吐量的根本原因,不在于它缩短了“单条数据”的处理耗时,而在于它将“多条数据”的 IO 等待时间重叠在了一起。 2. 场景对比:假设处理 100 条数据,每条查询耗时 10ms。 同步 I/O (串行): 必须等第 1 条结果回来,才能发第 2 条请求。 总耗时 = 100 × 10ms = 1000ms (1秒) 异步 I/O (并行): 第 1 条发出请求后,不等待结果,直接发第 2 条、第 3 条……直到填满缓冲区(Capacity)。这 100 个请求几乎是同时在网络上传输的。 总耗时 ≈ 10ms...
并发内功-线程中断机制全解
发表于2025-11-24|java|java
前言在 Java 并发编程中,“线程中断”(Thread Interruption)是一个高频出现但常被误解的概念。很多开发者误以为调用 interrupt() 就是“杀死”线程,实际上,Java 的中断机制是一种协作式的协议,而非抢占式的命令。 本文将从底层原理、API 辨析、状态交互以及 JUC 框架应用四个维度,带你彻底搞懂 Java 线程中断。 一、 中断的本质:从“命令”到“协商”1. 为什么废弃 Thread.stop()?Java 早期版本曾提供 Thread.stop() 方法来强制终止线程。这就像 Linux 的 kill -9,它不给线程任何喘息或清理资源的机会,会立即释放线程持有的所有锁。这极易导致数据不一致(例如:转账操作只执行了一半就终止),因此在 JDK 1.2 中即被标记为废弃。 2. 协作式设计Java 选择了**协作式(Cooperative)**中断机制。 动作: 当调用 t.interrupt() 时,JVM 仅仅是将线程 t 内部的一个布尔类型**“中断标志位”置为 true**。 结果: 线程 t...
并发内功-如何确定加什么类型的锁?
发表于2025-11-24|java|java
前言在 Java 并发编程(JUC)的学习中,我们往往容易陷入 API 的泥潭:掌握了 synchronized 的原理,背熟了 AQS 的源码,但在面对具体的业务场景时,却依然犹豫不决——“这里到底该用哪种锁?为什么?” 在 JDK 1.8 时代,锁的性能差异已不再像早期那么巨大,选型的核心依据从单纯的“性能”转向了**“场景匹配度”与“代码维护性”**。 本文将摒弃枯燥的 API 罗列,直接提供一套从实战出发的并发工具选型决策指南。 🚀 0. 精简速查版 (TL;DR)如果你时间紧迫,请直接参考这份选型决策树。在面对线程安全问题时,按顺序自问: 是数据容器(List, Map, Queue)吗? KV 存储 → ConcurrentHashMap (首选) 需要排序的 KV → ConcurrentSkipListMap 读多写极少(如白名单) → CopyOnWriteArrayList 生产消费队列 → ArrayBlockingQueue (必须有界) 是单个变量的简单操作(如 +1,赋值)吗? 极高并发统计(如接口限流计数) → LongAdder...
并发内功-如何确定加锁粒度
发表于2025-11-24|java|java
前言 前言 在并发编程中,我们常面临一个两难的抉择: 锁粒度太粗(如直接锁整个方法):虽然绝对安全且代码简单,但系统几乎退化为串行,多核 CPU 成了摆设。 锁粒度太细(如只锁某一行代码):并发度上去了,但带来了复杂的死锁风险,且过频的“加锁/解锁”引发的上下文切换(Context Switch)开销,反而可能拖慢系统。 本文不讨论“如何选择锁对象”或“该用哪种锁类”,只专注解决一个核心问题: 当必须加锁时,我们该如何精准地划定锁的时空范围,从而在保证线程安全的前提下,将性能压榨到极致? ⚡️ 精华速查版 (TL;DR)如果你时间紧迫,请掌握以下关于“粒度控制”的核心心法: 纵向拆分(时间维度): 快进快出。将 I/O、预处理、参数校验、复杂计算移出同步块,只锁住“修改共享数据”的那一瞬间。 横向拆分(空间维度): 专锁专用。如果两个共享变量互不干扰(如用户的“积分”和“头像”),请使用两把独立的锁(锁分离),不要用一把大锁通吃。 化整为零(数据维度): 借鉴 JDK 1.8 ConcurrentHashMap...
并发内功-如何确定加锁对象?
发表于2025-11-24|java|java
前言在 Java 并发编程中,学会写 synchronized 只是幼儿园水平,学会选择“锁谁”才是迈入高阶开发的门槛。 很多严重的线上 Bug,不是因为没加锁,而是因为锁错了对象。 锁了 this,结果外部代码恶意占用导致死锁。 锁了 Integer,结果自动装箱导致锁对象变了。 锁了 String 常量,结果导致无关的业务模块互相阻塞。 本文将剥离所有复杂的并发理论,单刀直入:当代码存在线程安全问题时,我到底该拿哪个对象当锁? ⚡️ 精华速查版:锁对象决策清单在写代码前,请对照下表进行“灵魂拷问”: 保护目标 ❌ 错误/不推荐写法 ✅ 最佳实践 (锁对象选择) 核心理由 实例变量 (非静态) synchronized(this) private final Object lock = new Object(); 封装性。避免外部代码持有你的对象锁造成干扰。 静态变量 (全局共享) synchronized(this) 或 new...
IDEA快捷键源码阅读神级指南
发表于2025-10-02|java|java
前言在软件开发中,我们不仅要编写代码,更要花费大量时间阅读代码——无论是团队成员的代码、第三方库的源码,还是经典框架的底层实现。IntelliJ IDEA 作为 Java (及其他语言) 开发的利器,提供了无数强大的功能来帮助我们理解和导航代码。 然而,真正的效率高手从不满足于鼠标点点点。熟练掌握快捷键,能让你在代码的世界里如行云流水般穿梭,将注意力完全集中在逻辑本身。 本文整理了一份在阅读源码时极其高效的 IDEA 快捷键清单,并补充了一些个人压箱底的“神器”,旨在帮助你摆脱鼠标,大幅提升代码阅读和理解的效率。 一、跳转与导航:指哪打哪,精准定位在源码的海洋中,精准、快速地跳转是最高频的操作。 功能名称 快捷键 (Windows/Linux) 用途和说明 查看声明/实现 Ctrl + B 或 Ctrl + 鼠标左键 【最常用】 无需多言的绝对核心。可以从任何变量、方法或类的使用处,一键跳转到其定义的地方。当光标在接口方法上时,它会聪明地弹出所有实现类列表供你选择。 查看实现类 Ctrl + Alt +...
方法参数是值传递还是引用传递?一篇彻底搞懂!
发表于2025-08-19|java|java
在Java面试和日常开发中,“Java是值传递还是引用传递?”是一个经典问题。很多开发者对此感到困惑,但答案是唯一的:Java永远是值传递(Pass by Value)。 为了彻底厘清这个概念,让我们首先将核心结论放在最前面: 核心结论 当传入的参数是 原始数据类型 (int, double 等) 或 不可变的引用类型 (如 String, Integer) 时: 无论方法内部对这个参数做什么操作,都不会影响到方法外部的原始变量。 当传入的参数是 可变的引用类型 (如 List, Map 等) 时: 如果修改的是对象自身的状态 (例如调用 list.add(item)),这个改变对方法外部是 可见的。 如果将参数引用指向一个新对象 (例如 list = new ArrayList<>()),这个改变对方法外部是 不可见的。 为什么会这样?接下来,我们将通过代码示例和原理解析,深入探讨背后的一切。 什么是值传递 (Pass by Value)?在程序设计语言中,方法调用时传递参数的方式主要有两种:值传递和引用传递。 值传递 (Pass by...
深入解析DCL单例模式:为何volatile不可或缺?
发表于2025-08-06|java|java
在Java并发编程中,单例模式的实现方式多种多样。其中,懒汉式的“双重检查锁定(Double-Checked Locking, DCL)”因其兼顾了线程安全、懒加载和高性能而备受推崇。然而,其标准实现中的 volatile 关键字常常让初学者感到困惑:既然已经有了 synchronized 锁,为什么还需要 volatile 来修饰实例变量呢?它究竟是画蛇添足,还是点睛之笔? 本文将带你深入剖析DCL的内部工作机制,彻底搞懂 volatile 在其中扮演的至关重要的角色。 完美的DCL实现首先,让我们看一下被广泛推荐的DCL单例模式标准代码(JDK 1.5+): 123456789101112131415161718192021222324252627282930313233343536package com.liboshuai.demo.thread.safe.singleton;/** * 懒汉式单例模式(线程安全 - 双重检查锁定版) * 优点:线程安全,且性能较高,实现了懒加载 * 这是推荐的懒汉式单例模式实现之一 */public class...
1234…23
avatar
李博帅
文章
224
标签
10
分类
10
Follow Me
公告
记录自己的学习成长
最新文章
Debian 13 安装 Docker 与最佳配置2026-01-27
Java并发-为什么要区分不同线程池而不使用统一的大线程池2026-01-26
Java并发-彻底搞懂 CompletableFuture 的线程切换规则2026-01-26
Debian 13 开发环境系统优化指南2026-01-23
Flink1.18.1本地idea源码调试环境搭建2026-01-23
分类
  • java51
  • 前端1
  • 大数据24
  • 容器化43
  • 杂货小铺18
  • 环境搭建15
  • 监控预警7
  • 算法8
标签
容器化 杂货小铺 java 监控预警 大数据 前端 计科基础 算法 运维手册 环境搭建
归档
  • 一月 2026 14
  • 十二月 2025 3
  • 十一月 2025 10
  • 十月 2025 1
  • 八月 2025 16
  • 七月 2025 19
  • 六月 2025 22
  • 五月 2025 11
网站信息
文章数目 :
224
运行时间 :
本站总字数 :
388.6k
最后更新时间 :
©2022 - 2026 By 李博帅
框架 Hexo 7.3.0|主题 Butterfly 5.3.5

豫ICP备2025118913号

搜索
数据加载中