- 博客(133)
- 收藏
- 关注
原创 sychronized原理(嚼碎了喂版)
调用了对象的 hashCode,但偏向锁的对象 MarkWord 中存储的是线程 id,如果调用 hashCode 会导致偏向锁被撤销,(轻量级锁会在锁记录中记录 hashCode,重量级锁会在 Monitor 中记录 hashCode)如果成功,当前线程获得锁,如果失败,表示 MarkWord 已经被替换成了其他线程的锁记录,说明在与其它线程竞争锁,当前线程就尝试使用自旋来获取锁。当有另外一个线程逐步来竞争锁的时候,就不能再使用偏向锁了,要升级为轻量级锁,使用的是等到竞争出现才释放锁的机制。
2025-05-16 19:57:29
655
原创 8.大总结
8.2.1 短信登录首先是用户提交手机号,后端将生成的验证码以及用户信息存入 session 中,用户登录时进行拦截并从 session 中拿出来信息校验,并把用户信息存入 ThreadLocal 中每个 tomcat 有自己的一份 session,分布式、微服务下有多个 tomcat 实例,之间的 session 无法共享负载均衡器通过特定算法如 IP 哈西,保证同一用户的请求始终路由到同一服务器。(失去负载均衡的灵活性)session 复制,所有服务器同步 session 变更。(带宽消耗大)
2025-05-10 17:04:37
742
原创 6.秒杀优化
秒杀业务的优化思路是什么?先利用 Redis 完成库存余量、一人一单判断,完成抢单业务再将下单业务放入阻塞队列,利用独立线程异步下单基于阻塞队列的异步秒杀存在哪些问题?内存限制问题:一直往阻塞队列中放,容易 OOM数据安全问题:数据全在 JVM 内存中(阻塞队列中),挂了全没了问题 1-全局唯一 IDid 不能具有明显的规则mysql 的自增 id 无法保证以后的业务解决方案:采用全局 ID 生成器,组成为:符号位(永远为 0),时间戳(31bit),序列号(32bit)
2025-05-10 16:58:41
1051
原创 2.商户查询缓存
例1:Static final ConcurrentHashMap<K,V> map = new ConcurrentHashMap<>();本地用于高并发例2:static final Cache<K,V> USER_CACHE = CacheBuilder.newBuilder().build();用于redis等缓存例3:Static final Map<K,V> map = new HashMap();本地缓存。
2025-05-10 16:53:20
1194
原创 5.Redission
基于 setnx 实现的分布式锁存在下面的问题:重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如 HashTable 这样的代码中,他的方法都是使用 synchronized 修饰的,假如他在一个方法内,调用另一个方法,那么此时如果是不可重入的,不就死锁了吗?所以可重入锁他的主要意义是防止死锁,我们的 synchronized 和 Lock 锁都是可重入的。
2025-05-10 16:46:22
1164
原创 4.分布式锁
利用 set nx ex 获取锁,并设置过期时间,保存线程标示释放锁时先判断线程标示是否与自己一致,一致则删除锁特性:- 利用 set nx 满足互斥性- 利用 set ex 保证故障时锁依然能释放,避免死锁,提高安全性- 利用 Redis 集群保证高可用和高并发特性。
2025-05-10 16:44:42
803
原创 3.优惠券秒杀
当用户抢购时,就会生成订单并保存到 tb_voucher_order 这张表中,而订单表如果使用数据库自增 ID 就存在一些问题:id 的规律性太明显受单表数据量的限制如果我们的 id 具有太明显的规则,用户或者说商业对手很容易猜测出来我们的一些敏感信息,比如商城在一天时间内,卖出了多少单,这明显不合适。随着我们商城规模越来越大,mysql 的单表的容量不宜超过 500W,数据量过大之后,我们要进行拆库拆表,但拆分表了之后,他们从逻辑上讲他们是同一张表,所以他们的 id 是不能一样的,于是乎我们需要。
2025-05-10 16:41:05
987
原创 1.短信登录
是否需要会话共享?├─ 否 → 单机部署或粘滞会话└─ 是 → 选择集中存储方案├─ 高性能要求 → Redis/Memcached├─ 强一致性要求 → 数据库+缓存└─ 安全敏感 → 客户端存储+加密理解 Session 共享问题的核心在于认识到有状态服务与无状态扩展之间的本质矛盾。现代分布式系统通常采用"尽量无状态,必要时集中存储"的折中方案,在一致性与可用性之间取得平衡。
2025-05-10 16:24:51
907
原创 0.环境初始化
前端文件在 html\hmdp 下,挂载到 /usr/share/nginx/html 下所以要求 nginx.conf :;反向代理:proxy_pass http://host.docker.internal:8081;;因为容器内端口为80因为 Nginx 监听 80 端口,且 Docker 映射了 80→80,所以访问(80 端口)就能看到页面d对应的logs,nginx.conf 也挂载。
2025-05-10 16:18:09
364
原创 基于web应用用户安全的千字大总结及方案选择
今天,我们将深入探讨Web应用用户安全的核心问题,并系统分析各种认证方案的安全机制。本文不仅会揭示常见安全漏洞的本质,还将通过对比主流方案的技术细节,帮助开发者构建坚不可摧的认证体系。
2025-04-23 16:54:45
1000
原创 一文讲清楚JWT/Session的不同原理、所有注意点及场景应用
门卫检查会员卡→ 这就是身份验证给你一个手环→ 类似Session给你一张防伪电子卡→ 类似JWT在Web开发中,我们需要用技术手段实现类似的验证机制。今天我们就来彻底搞懂两种主流方案:Session和JWT。修眼镜用螺丝刀(Session适合集中式Web)拧螺母用扳手(JWT适合分布式API)理解原理后,你甚至可以像瑞士军刀一样组合使用它们。适合业务场景的方案才是最好的!(完)
2025-04-21 09:35:37
892
原创 ClassCastException
这个错误是由于在 LoginInterceptor 的 preHandle 方法中,尝试将一个 com.dianping.entity.User 对象强制转换为 com.dianping.dto.UserDTO 类型,但这两个类之间没有继承关系,因此导致了 ClassCastException。修改业务逻辑:如果 User 和 UserDTO 之间的转换是必要的,考虑修改业务逻辑,确保在需要的地方进行正确的类型转换。在某个地方错误地将 User 对象赋值给了 UserDTO 类型的变量。
2025-04-20 20:24:10
173
原创 一文彻底搞懂Windows上Docker配置MySQL主从复制(MySQL 8.0.25)
本文面向刚接触 Docker 和 MySQL 主从复制的开发者,以。
2025-04-15 22:39:00
358
原创 一站式Windows下Docker开启MySQL并链接本地Navicat(附乱码解决方案)
核心步骤:配置my.cnf字符集 + 正确挂载目录 + Navicat连接设置。避坑重点:Windows目录权限、字符集统一、容器IP与端口。按照本教程操作,你可以轻松在Windows下用Docker部署MySQL,并用Navicat高效管理数据!如有问题,欢迎评论区留言,我会第一时间回复!
2025-04-14 17:21:39
863
2
原创 一文搞懂 Ubuntu 账户问题及 SSH 连接问题(新手版)
Ubuntu 通过限制root权限和 SSH 默认配置保障了系统安全。理解其设计逻辑后,可根据实际需求调整策略,但务必权衡安全性与便利性。在大多数场景下,普通用户 +sudo+ SSH 密钥是最佳实践。
2025-04-04 10:28:26
716
原创 Linux系统安装MySQL 8.0完整指南(新手友好版)
本教程详细介绍了在Linux系统上安装和配置MySQL 8.0的全过程,从卸载旧版本到配置远程连接,涵盖了新手可能遇到的各种问题。特别强调了安全配置的重要性,建议在生产环境中遵循安全最佳实践。如果你在安装过程中遇到任何问题,欢迎在评论区留言讨论。
2025-03-31 21:59:46
1449
原创 一文搞懂 Linux 安装/启动 Redis 全部细节
通过以上步骤,你已经成功在 Linux 系统上安装并启动了 Redis,并配置了 systemd 服务管理。本文涵盖了从环境准备到启动配置的全部细节,帮助你快速掌握 Redis 的安装和配置。本文将从零开始,详细介绍如何在 Linux 系统上安装和启动 Redis,包括所需环境、安装步骤、配置文件设置以及启动方式。每一步都附带具体命令,帮助你快速掌握 Redis 的安装和配置。从 Redis 官网下载最新版本的源码包,例如 Redis 7.0.0。命令编译 Redis 源码,并将其安装到系统目录。
2025-03-31 20:45:39
590
原创 Spring Cloud Consul使用指南
遇到问题时,重点检查:网络连通性、依赖版本(建议使用Spring Cloud 2021.x + Consul 1.11.x)、Consul权限配置。
2025-03-29 22:05:31
743
原创 如何在 Java 中控制多个线程的执行顺序?
★可能追问:1. CountDownLatch和CyclicBarrier的区别?2. 如何实现线程A->B->C循环执行10次?3. Condition唤醒机制可能产生什么问题?▲加分项:结合APM工具(SkyWalking)绘制线程调用链,用JMC分析线程调度热点。▲得分点:陷阱规避意识 + 设计模式应用 + 故障排查方法论。
2025-03-29 17:19:55
376
原创 Docker容器无法连接宿主机MySQL?一招解决网络隔离问题!
Docker 为容器提供了一个特殊 DNS host.docker.internal。若方法 1 不生效,可能是 MySQL 限制了外部访问。(一款数据库管理工具),但发现它无法连接本地的 MySQL 服务。最近在 Windows 上使用 Docker 部署了。,直接指向宿主机的网络接口。经过排查,问题核心在于。
2025-03-28 19:14:42
892
原创 什么是 Java 的 ForkJoinPool?
任务拆分过细 | 任务管理开销超过计算时间 → 增大阈值或合并小任务。是 Java 7 引入的分治任务线程池,专门为“递归拆分任务”的场景设计,核心思想是将大任务拆成小任务并行执行,最后合并结果,适合处理计算密集型任务。| 线程饥饿 | 某线程长时间占用任务导致其他线程空闲 → 避免任务执行时间差异过大(如均匀拆分任务)。| 资源泄漏 | 未正确关闭线程池 → 使用。追问1:如何设置合理的任务拆分阈值(THRESHOLD)?
2025-03-18 15:25:08
623
原创 ThreadLocal全面解析
}* }* </pre>. . . 从 Java 官方文档中的描述:ThreadLocal 类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过 get 和 set 方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal 实例通常来说都是 private static 类型的,用于关联线程和线程上下文。
2025-03-17 16:26:05
1049
原创 为什么 Java 中的 ThreadLocal 对 key 的引用为弱引用?
ThreadLocal 的 key 使用弱引用(WeakReference),是为了避免因线程长期存活(如线程池场景)导致 ThreadLocal 对象无法被回收,从而引发内存泄漏。此时,ThreadLocalMap 的 Entry 仍持有 ThreadLocal 的强引用,导致 ThreadLocal 对象无法被 GC 回收,内存泄漏(如下图)。通过结合弱引用和手动清理,ThreadLocal 在保证线程安全的同时,尽可能降低了资源泄漏的风险。Q1:弱引用能完全避免内存泄漏吗?场景验证(代码示例)
2025-03-17 16:07:48
946
原创 什么是 Java 的 CAS(Compare-And-Swap)操作?
维度 | CAS | 锁(如 synchronized) || 线程阻塞 | 无阻塞(自旋) | 阻塞(等待锁释放) |(ARM) | 通过“加载-链接/存储-条件”实现原子操作 | 低功耗设备 |前缀(CPU) | 锁定总线或缓存行,保证原子性 | 多核竞争环境 |
2025-03-17 16:03:01
812
原创 什么是 Java 的 CompletableFuture?
是 Java 8 引入的异步编程工具类,用于简化多线程任务编排,支持非阻塞、链式调用和组合多个异步任务的结果。的不足(如无法手动设置结果、难以处理任务依赖),是构建高性能、响应式应用的核心组件。掌握其设计思想和底层机制,能够显著提升分布式系统和微服务架构的性能与可靠性。默认线程池有什么问题?什么是 Java 的。
2025-03-17 15:44:39
938
原创 什么是 Java 的 StampedLock?
写锁 | 独占锁,同一时间只允许一个线程写,会阻塞所有读锁和写锁。| 读操作占比超过 90% | ✔️ | 乐观读优势显著 || 锁重入需求频繁 | ❌ | 需手动管理重入逻辑 || 场景 | 是否适用 | 原因 || 需要条件变量(Condition)| ❌ | 不支持,需改用。
2025-03-17 15:39:42
690
原创 什么是 Java 的 CountDownLatch?
问题 | 原因与解决方案 |是 Java 并发包里的一个工具类,让一个或多个线程等待其他线程完成操作后再继续执行。| 计数设置错误 | 初始化时计数器大于实际子线程数 → 严格匹配任务数和计数。场景:电商订单支付后,需同时通知库存系统、物流系统和积分系统,全部成功后更新订单状态。| 死锁 | 子线程未调用。你的回答(口语化,面试场景)
2025-03-17 15:33:43
385
原创 点击文件对应的系统底层
如果你遇到了具体的问题,比如某个软件打开大文件卡顿,我可以帮你分析该软件的具体瓶颈并提供更有针对性的优化方法!整个过程中,计算机需要经历多个阶段来处理大文件,我们来详细拆解这个过程。当你打开一个很大的文件时,电脑变得卡顿,主要是因为涉及。
2025-03-17 12:20:53
841
原创 Mybatis语法bug
根据您的代码和报错信息分析,这是一个 MyBatis XML 文件中的 SQL 语法问题。补充说明:若使用 Oracle 数据库需改用。建议检查数据库类型并统一时间函数的使用规范。若使用 MySQL 数据库,推荐改用。是 XML 保留字符,必须转义为。,PostgreSQL 建议使用。XML 特殊字符问题。数据库函数兼容性建议。CDATA 区块方案。
2025-03-13 22:14:34
469
原创 什么是 Java 的 CyclicBarrier?
你的回答(口语化,面试场景)面试官:什么是 Java 的 ?你:好的,我来举个例子说明。比如一个游戏需要5个玩家全部准备就绪才能开始,这时候可以用 。核心作用 让一组线程互相等待,直到所有线程都到达屏障点(Barrier),再一起继续执行。它像一道关卡,必须等所有线程到齐才能放行。核心特性对比 CountDownLatch重置能力: 可重复用, 只能一次性。触发角色: 是线程互相等待, 是主线程等待子线程。预测面试官可能的追问及回答追问1:如果某个线程在 时被中断了,会发生什么
2025-03-13 17:03:54
261
原创 什么是协程?Java 支持协程吗?
协程的栈空间可以动态调整(如几 KB 到几十 KB),远小于线程的固定栈(通常几 MB)。的引入,让开发者无需重写代码,就能享受协程的并发优势。例如,遇到 I/O 操作时,协程自动挂起,让出 CPU 资源,待 I/O 完成后恢复执行。协程(Coroutine)是一种用户态的轻量级线程,由程序自身控制调度,而非操作系统内核。是 Java 19+ 引入的轻量级线程,由 JVM 调度,底层复用操作系统线程(载体线程)。操作系统线程是稀缺资源(通常最多几千个),而协程通过挂起机制,让少量线程服务海量任务。
2025-03-13 16:55:48
718
原创 Java 的 CopyOnWriteArrayList 和 Collections.synchronizedList 有什么区别?分别有什么优缺点?
问题:什么是 ?解答: 是 Java 并发包 () 提供的一种 线程安全 的 实现,它的核心特性是 写时复制(Copy-On-Write)。即,每当执行修改操作(如 、、)时,都会创建 一个新的数组,修改操作会在这个新数组上进行,操作完成后再将新数组赋值给 的内部变量。底层是一个 数组,存储数据时会复制数组。示例: 方法分析:示例: 方法分析: 通过 进行遍历:特点:示例:结论:适用于 读多写少 的场景,如:如果你的应用 读取操作远远多于写操作,可以考虑使用 来提高并发性能!🚀你的问题
2025-03-13 16:55:35
813
原创 ConcurrentHashMap 和 Hashtable 的区别是什么?
是 Java 早期的线程安全 实现,存储 键值对 (key-value),内部采用 数组 + 链表 实现 哈希表 (Hash Table) 结构。Hashtable 的特点特性说明线程安全使用 关键字,所有操作都是 同步 的,适用于多线程环境。不允许 键和值 会抛 ,与 不同。底层结构采用 数组 + 链表 处理哈希冲突(JDK 8 及以前)。默认负载因子 0.75当 时,触发扩容,新的容量是 原来的 2 倍 + 1。遍历顺序不保证稳定 不
2025-03-13 16:50:39
1046
原创 一文读懂HashMap底层源码
![[Pasted image 20250122192925.png]]![[Pasted image 20250122170458.png]]![[Pasted image 20250122185610.png]]在 Java 中,数组的最大索引是 Integer.MAX_VALUE,其值为 2³¹ - 1(约 21 亿)![[Pasted image 20250122191056.png]]默认容量是 16,负载因子为 0.75,这个组合是在性能和空间之间找到的平衡。较高的负载因子(如 1.0)会减少空
2025-03-13 16:49:19
692
原创 Java 中的序列化和反序列化是什么?
是用来确保类版本兼容性的标识符。推荐显式定义,以避免不同版本类之间的兼容性问题。如果类结构发生变化而不更新,可能导致反序列化失败。静态变量不会被序列化,因为它是属于类的,所有对象共享一个值,不依赖于实例状态。序列化只会保存对象实例的状态(即实例变量的值),静态变量的值是通过类的加载来获取的。序列化是一种数据转换过程,形式不仅限于字节流,还包括 JSON、XML 等。前后端交互通常以文本化序列化形式(如 JSON)进行传输,数据库存储时多以结构化或文档形式存储,而不是直接存储序列化的对象。
2025-03-13 16:48:10
1082
原创 Java 中的深拷贝和浅拷贝的区别
Java 中的深拷贝和浅拷贝有什么区别?浅拷贝(Shallow Copy):深拷贝(Deep Copy):浅拷贝可以通过实现 接口和重写 方法来实现。深拷贝示例深拷贝需要手动实现递归复制。注意点浅拷贝的风险:深拷贝的复杂性:深拷贝工具类:两者根据需求选择,灵活使用。 方法定义: 方法是 类中的一个 方法,声明如下:它是一个本地方法,底层由 JVM 实现,用于创建当前对象的浅拷贝。为什么使用 :如何生效:注意事项直接调用 的 会导致问题:浅拷贝:自定义深拷贝:通过 ,
2025-03-13 16:47:40
692
原创 Java 中的深拷贝和浅拷贝有什么区别?
Java 中的深拷贝和浅拷贝有什么区别?浅拷贝(Shallow Copy):深拷贝(Deep Copy):浅拷贝可以通过实现 接口和重写 方法来实现。深拷贝示例深拷贝需要手动实现递归复制。注意点浅拷贝的风险:深拷贝的复杂性:深拷贝工具类:两者根据需求选择,灵活使用。 方法定义: 方法是 类中的一个 方法,声明如下:它是一个本地方法,底层由 JVM 实现,用于创建当前对象的浅拷贝。为什么使用 :如何生效:注意事项直接调用 的 会导致问题:浅拷贝:自定义深拷贝:通过 ,
2025-03-13 11:48:08
784
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人