Spring Boot 中的 synchronized(this):到底锁住了谁?
“锁住自己,还得看看你是不是全公司唯一一份。” 在 Java 里,synchronized(this) 代表锁住当前对象。在单线程环境下这很好理解,但一旦进入 Spring Boot 多线程并发的世界,很多人就开始困惑了: “我这个接口加了 synchronized(this),为啥还是串行执行?或者为啥根本没锁住?” 今天,我们就以最接地气的 Spring Boot 接口请求为例,彻底讲清楚 this 在 Bean 中到底锁的是谁、对谁生效、什么场景会起作用。 一、this 是谁?在 Java 中,this 是当前对象的引用。 1234567public class Person { String name; public void introduce() { System.out.println("我叫 " + this.name); }} 没错,this 指向的是当前对象。不同的对象就有不同的 this。 你可以把 this 理解成对象界的身份证,一个对象一个号,不能复印...
synchronized的升级过程
synchronized 的升级过程(精简 & 好笑版)一句话总结 synchronized 的锁,会随着竞争程度一路“升职”,但只升不降。 一、synchronized 是干嘛的?很简单:👉 保证同一时刻,只有一个线程能干活👉 顺便还送你一张 happens-before 的内存可见性门票 本质上,它就是在用 对象自带的监视器锁(Monitor)。 二、锁升级路线图(主线剧情)1无锁 → 偏向锁(已退休) → 轻量级锁 → 重量级锁 记住一句话就够了: 竞争越激烈,锁越“重”。 三、四种锁,用一句话讲清楚1️⃣ 无锁:世界很和平 没人抢,直接用 性能最好 对象头里就是普通信息 🧘:“今天没人吵架。” 2️⃣ 偏向锁:对象只爱一个线程(已退役) 第一次用锁的线程,被对象“记住” 后面再来,连 CAS 都懒得做 Java 15+ 默认禁用,已弃用 💔:“曾经专一,现在分手。” 3️⃣ 轻量级锁:礼貌地抢 多线程来了,但不算多 用 CAS + 自旋 运行在 用户态(Ring 3) 不阻塞,先忙等一会儿 🤺:“我先转几圈看看你放不放手。” 4...
《写给 Java 程序员的七大设计原则全解析:别让你的代码变成意大利面》🍝
“代码如诗,架构如歌。设计原则,便是那不走调的节拍。” 🎯 前言:什么是设计原则?在软件开发的世界里,我们追求的是高内聚、低耦合、可维护、易扩展。而设计原则就是那一把衡量代码质量的“戒尺”,帮助我们写出健壮、优雅的代码。 今天我们就来聊聊——面向对象的七大设计原则,每一条我都会配上一个小例子,助你理解记忆。 🧱 一、单一职责原则(SRP)✨ 定义: 一个类只负责一项职责。 “只做一件事,并做好它。” 🧩 举个栗子:class Report { public void generate() { System.out.println("生成报表内容"); } public void print() { System.out.println("打印报表"); } public void sendEmail() { System.out.println("发送报表邮件...
别慌,Java只有值传递——一次搞懂“为啥我改了它还不变”!
亲爱的程序员兄弟姐妹们: 是不是有那么一瞬间,你写着写着代码,突然怀疑人生: int a = 1; int b = a; a = 2; System.out.println(b); // 结果是1,没变! User user = new User("张三"); User user1 = user; user = new User("李四"); System.out.println(user1.getName()); // 结果还是张三,没变! 这是不是耍我? 别慌,今天咱们用箱子和标签这个有趣的比喻,帮你一次性搞清楚! 一、Java的铁律:只有值传递!无论是: 基本数据类型(int、double、char…) 引用数据类型(对象、数组、集合…) Java 永远都是值传递。 二、基本数据类型:值传递——我拿的是实物int a = 1; int b = a; a = 2; System.out.println(b); // 输出1 这里的 a 和 b 像是两个独立的小箱子。 开始时,你把 1 这个“苹果”放到了两个箱子里。...
江湖险恶:ReadWriteLock 与 ReentrantLock 的爱恨情仇
话说在Java的江湖上,有两大门派闻名遐迩,一个叫ReentrantLock(可重入锁) ,一个叫ReadWriteLock(读写锁) 。 江湖人称:一个讲究「一夫当关,万夫莫开」,一个讲究「以和为贵,能读就别写」。 今天我们就来揭开它们的面纱,聊聊它们的区别、用法、场景,顺便插科打诨,轻松一下。 【一】人物介绍 锁派 简介 主要技能 适用场景 ReentrantLock 可重入锁,一把锁走天下 支持公平锁/非公平锁、可中断、超时、Condition 读多写多、竞争激烈 ReadWriteLock 读写分离,善于协调 读多写少,提升并发性 典型读多写少场景 【二】ReentrantLock:霸道总裁,万事亲力亲为ReentrantLock 是个「霸道总裁」,不分青红皂白,谁进来都要排队。就算只是读个数,也得等别人写完。效率?它不太关心。 12345678910ReentrantLock lock = new ReentrantLock();public void doSomething() { lock.lock(); try...
CAP 定理:奶茶店账本里的真相
CAP 定理:奶茶店账本里的真相 一、CAP 定理到底说了啥?CAP 定理是分布式系统的“祖宗规则”: C(Consistency 一致性) :所有人看到的数据必须一样。 A(Availability 可用性) :每次请求都要有响应,别让顾客白跑。 P(Partition Tolerance 分区容错性) :网络再怎么出幺蛾子,系统也得撑住。 ⚡ 重点:在发生网络分区时,你只能在 C 和 A 里二选一。平时风平浪静的时候,三者可以共存;一旦断网,账和生意只能保一个。 二、奶茶店的比喻想象你开了 3 家连锁奶茶店: 一致性(C) :总部库存剩 100 杯,广州卖出 1 杯,上海立刻知道只剩 99。 可用性(A) :顾客来点单,必须给结果。 分区容错(P) :广州和总部断网了,上海还能继续营业。 当广州断网时: 选 CP:广州店暂停营业,等总部对完账再卖 → 数据一致,但顾客可能骂娘。 选 AP:广州店继续营业,先记小本本,账以后再对 → 顾客开心,但可能超卖。 选 CA:既保证账对、又保证随时营业。听起来很美妙,但前提是——永远不发生网络分区。 换句话说,CA 只...
JetBrains IDEA Commit 界面进化:从“模态弹窗”到“侧边面板”的轻盈变奏
引子:聚光灯还是自由式舞台?想象这样一个场景:你在 JetBrains IDE 中敲完代码,准备提交。过去,一旦你按下提交,弹出的模态窗口像个小舞台,只你一个人独占舞台的焦点;但从 2025.1 开始,这舞台被拆解成侧边的轻舞台:你可以边写提交信息边回到代码窗口,一切像是自由漫步,而不是固定舞步。 那么,为什么 JetBrains 把“弹窗提交”换成了“侧边提交”?又该如何重新点亮那盏弹窗的聚光灯? 非模态提交成默认,那是为什么? 更轻盈、更灵活的体验JetBrains 团队认为,“非模态提交界面让 IDE 感觉更轻巧且易用”,符合现代日常“频繁提交”的开发节奏。Reddit+1intellij-support.jetbrains.com 允许同时查看代码、文件树、Diff —— 不被提交界面束缚Reddit 上用户痛并摇摆地说: “我一般讨厌模态,但模态提交让我专注……这也是我坚持用 JetBrains 而不是 VS Code 的原因。”Reddit UI 统一、维护简化将提交统一为工具窗口风格,避免维护两个 UI 的复杂性,并为未来功能扩展预留空间。黑客新闻...
“rwx”三兄弟的奇妙夜:Linux 权限世界大冒险
各位码农老铁、系统玩家、半路出家的脚本小王子: 欢迎来到神秘而又滑稽的世界——Linux 文件权限系统,今天我们将深入了解 rwx 三兄弟如何管理文件的“出入证件”,以及数字权限背后隐藏的“密码”。 👨👨👧 文件权限的“三班倒”:用户、组、其他人在 Linux 世界里,每个文件都是个高贵冷艳的小公主,她只给三类人开放权限: 👤 user(文件拥有者) 👥 group(同个组的“亲戚”) 🌍 others(吃瓜群众) 你以为这是门禁系统?错了,这是皇宫保安三班倒! 🧙♂️ 权限的三位一体:r, w, x在文件门口守着的,是我们亲爱的三兄弟: 符号 含义 打个比方 r read(读) 你能看剧本 📖 w write(写) 你能改剧情 ✍️ x execute(执行) 你能登台演戏 🎭 你有 r?恭喜你能“偷窥”剧本。你有 w?好家伙,导演也不敢惹你。你有 x?你直接上台当主角! 🔢 数字权限:他们不是乱写的,真·有含义!Linux 授权的数字看起来像是玄学,其实是数学家的游戏。 每一个权限位都是 3 位二进制数,对应: r...
MySQL 中的快照读与当前读:原理、区别与应用详解
在使用 MySQL(InnoDB 引擎)进行事务开发时,经常会遇到两个核心概念:快照读(Snapshot Read) 和 当前读(Current Read) 。它们直接影响事务的并发行为、数据一致性以及锁的使用。 tips:本文对应的幽默版本请跳转:https://juejin.cn/post/7498739635012829199 本文将系统讲解: 两者的定义与区别 常见 SQL 的读类型归属 实际应用场景与选择策略 如何处理幻读问题 常见误区澄清 三大关键点需特别牢记: ✅ 当前读读取的是其他事务已提交的“最新数据” ,绕过自身快照视图 ✅ 当前读可通过加锁(如 next-key lock)解决幻读问题 ✅ LOCK IN SHARE MODE 会加共享锁,锁定数据防止别人修改,但自己不改 一、基本概念1. 快照读(Snapshot Read) 是指读取的是事务开始时的数据快照,而不是当前最新的数据。 基于 MVCC(多版本并发控制)实现,不加锁,性能高。 避免读写冲突,但可能存在幻读问题。 示例: 1SELECT * FROM product WHERE...
在 CentOS Stream 9 配置 ZeroTier Moon 实现内网穿透
前言在分布式网络环境中,远程访问和内网穿透是常见需求。ZeroTier 作为一款高效的虚拟组网工具,能够提供高效、稳定的 P2P 连接,并且支持 Moon(中继服务器)技术,进一步优化网络性能。本篇文章将详细介绍如何在 CentOS Stream 9 上安装 ZeroTier,配置 Moon 服务器,并让 Mac 和 Windows 客户端接入。 1. 准备资源和环境在开始安装和配置 ZeroTier 之前,需要确保以下资源: 服务器:一台具备公网 IP 地址的 CentOS Stream 9 服务器。 客户端设备:Windows 和 Mac 计算机。 网络访问权限:服务器需要能够访问互联网,以便下载 ZeroTier 并建立连接。 防火墙配置:确保服务器允许 ZeroTier 使用的端口(默认 9993/UDP)开放。 ZeroTier 账号:需要在 ZeroTier 官方网站 my.zerotier.com 注册并创建网络。 2. 安装 ZeroTier2.1 添加 ZeroTier 官方仓库并安装12sudo yum install epel-releas...














