- 博客(117)
- 收藏
- 关注
原创 一文搞懂 Ubuntu 账户问题及 SSH 连接问题(新手版)
Ubuntu 通过限制root权限和 SSH 默认配置保障了系统安全。理解其设计逻辑后,可根据实际需求调整策略,但务必权衡安全性与便利性。在大多数场景下,普通用户 +sudo+ SSH 密钥是最佳实践。
2025-04-04 10:28:26
587
原创 Linux系统安装MySQL 8.0完整指南(新手友好版)
本教程详细介绍了在Linux系统上安装和配置MySQL 8.0的全过程,从卸载旧版本到配置远程连接,涵盖了新手可能遇到的各种问题。特别强调了安全配置的重要性,建议在生产环境中遵循安全最佳实践。如果你在安装过程中遇到任何问题,欢迎在评论区留言讨论。
2025-03-31 21:59:46
1052
原创 一文搞懂 Linux 安装/启动 Redis 全部细节
通过以上步骤,你已经成功在 Linux 系统上安装并启动了 Redis,并配置了 systemd 服务管理。本文涵盖了从环境准备到启动配置的全部细节,帮助你快速掌握 Redis 的安装和配置。本文将从零开始,详细介绍如何在 Linux 系统上安装和启动 Redis,包括所需环境、安装步骤、配置文件设置以及启动方式。每一步都附带具体命令,帮助你快速掌握 Redis 的安装和配置。从 Redis 官网下载最新版本的源码包,例如 Redis 7.0.0。命令编译 Redis 源码,并将其安装到系统目录。
2025-03-31 20:45:39
536
原创 Spring Cloud Consul使用指南
遇到问题时,重点检查:网络连通性、依赖版本(建议使用Spring Cloud 2021.x + Consul 1.11.x)、Consul权限配置。
2025-03-29 22:05:31
667
原创 如何在 Java 中控制多个线程的执行顺序?
★可能追问:1. CountDownLatch和CyclicBarrier的区别?2. 如何实现线程A->B->C循环执行10次?3. Condition唤醒机制可能产生什么问题?▲加分项:结合APM工具(SkyWalking)绘制线程调用链,用JMC分析线程调度热点。▲得分点:陷阱规避意识 + 设计模式应用 + 故障排查方法论。
2025-03-29 17:19:55
356
原创 Docker容器无法连接宿主机MySQL?一招解决网络隔离问题!
Docker 为容器提供了一个特殊 DNS host.docker.internal。若方法 1 不生效,可能是 MySQL 限制了外部访问。(一款数据库管理工具),但发现它无法连接本地的 MySQL 服务。最近在 Windows 上使用 Docker 部署了。,直接指向宿主机的网络接口。经过排查,问题核心在于。
2025-03-28 19:14:42
427
原创 什么是 Java 的 ForkJoinPool?
任务拆分过细 | 任务管理开销超过计算时间 → 增大阈值或合并小任务。是 Java 7 引入的分治任务线程池,专门为“递归拆分任务”的场景设计,核心思想是将大任务拆成小任务并行执行,最后合并结果,适合处理计算密集型任务。| 线程饥饿 | 某线程长时间占用任务导致其他线程空闲 → 避免任务执行时间差异过大(如均匀拆分任务)。| 资源泄漏 | 未正确关闭线程池 → 使用。追问1:如何设置合理的任务拆分阈值(THRESHOLD)?
2025-03-18 15:25:08
596
原创 ThreadLocal全面解析
}* }* </pre>. . . 从 Java 官方文档中的描述:ThreadLocal 类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过 get 和 set 方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal 实例通常来说都是 private static 类型的,用于关联线程和线程上下文。
2025-03-17 16:26:05
1034
原创 为什么 Java 中的 ThreadLocal 对 key 的引用为弱引用?
ThreadLocal 的 key 使用弱引用(WeakReference),是为了避免因线程长期存活(如线程池场景)导致 ThreadLocal 对象无法被回收,从而引发内存泄漏。此时,ThreadLocalMap 的 Entry 仍持有 ThreadLocal 的强引用,导致 ThreadLocal 对象无法被 GC 回收,内存泄漏(如下图)。通过结合弱引用和手动清理,ThreadLocal 在保证线程安全的同时,尽可能降低了资源泄漏的风险。Q1:弱引用能完全避免内存泄漏吗?场景验证(代码示例)
2025-03-17 16:07:48
851
原创 什么是 Java 的 CAS(Compare-And-Swap)操作?
维度 | CAS | 锁(如 synchronized) || 线程阻塞 | 无阻塞(自旋) | 阻塞(等待锁释放) |(ARM) | 通过“加载-链接/存储-条件”实现原子操作 | 低功耗设备 |前缀(CPU) | 锁定总线或缓存行,保证原子性 | 多核竞争环境 |
2025-03-17 16:03:01
799
原创 什么是 Java 的 CompletableFuture?
是 Java 8 引入的异步编程工具类,用于简化多线程任务编排,支持非阻塞、链式调用和组合多个异步任务的结果。的不足(如无法手动设置结果、难以处理任务依赖),是构建高性能、响应式应用的核心组件。掌握其设计思想和底层机制,能够显著提升分布式系统和微服务架构的性能与可靠性。默认线程池有什么问题?什么是 Java 的。
2025-03-17 15:44:39
922
原创 什么是 Java 的 StampedLock?
写锁 | 独占锁,同一时间只允许一个线程写,会阻塞所有读锁和写锁。| 读操作占比超过 90% | ✔️ | 乐观读优势显著 || 锁重入需求频繁 | ❌ | 需手动管理重入逻辑 || 场景 | 是否适用 | 原因 || 需要条件变量(Condition)| ❌ | 不支持,需改用。
2025-03-17 15:39:42
673
原创 什么是 Java 的 CountDownLatch?
问题 | 原因与解决方案 |是 Java 并发包里的一个工具类,让一个或多个线程等待其他线程完成操作后再继续执行。| 计数设置错误 | 初始化时计数器大于实际子线程数 → 严格匹配任务数和计数。场景:电商订单支付后,需同时通知库存系统、物流系统和积分系统,全部成功后更新订单状态。| 死锁 | 子线程未调用。你的回答(口语化,面试场景)
2025-03-17 15:33:43
341
原创 点击文件对应的系统底层
如果你遇到了具体的问题,比如某个软件打开大文件卡顿,我可以帮你分析该软件的具体瓶颈并提供更有针对性的优化方法!整个过程中,计算机需要经历多个阶段来处理大文件,我们来详细拆解这个过程。当你打开一个很大的文件时,电脑变得卡顿,主要是因为涉及。
2025-03-17 12:20:53
831
原创 Mybatis语法bug
根据您的代码和报错信息分析,这是一个 MyBatis XML 文件中的 SQL 语法问题。补充说明:若使用 Oracle 数据库需改用。建议检查数据库类型并统一时间函数的使用规范。若使用 MySQL 数据库,推荐改用。是 XML 保留字符,必须转义为。,PostgreSQL 建议使用。XML 特殊字符问题。数据库函数兼容性建议。CDATA 区块方案。
2025-03-13 22:14:34
422
原创 什么是 Java 的 CyclicBarrier?
你的回答(口语化,面试场景)面试官:什么是 Java 的 ?你:好的,我来举个例子说明。比如一个游戏需要5个玩家全部准备就绪才能开始,这时候可以用 。核心作用 让一组线程互相等待,直到所有线程都到达屏障点(Barrier),再一起继续执行。它像一道关卡,必须等所有线程到齐才能放行。核心特性对比 CountDownLatch重置能力: 可重复用, 只能一次性。触发角色: 是线程互相等待, 是主线程等待子线程。预测面试官可能的追问及回答追问1:如果某个线程在 时被中断了,会发生什么
2025-03-13 17:03:54
246
原创 什么是协程?Java 支持协程吗?
协程的栈空间可以动态调整(如几 KB 到几十 KB),远小于线程的固定栈(通常几 MB)。的引入,让开发者无需重写代码,就能享受协程的并发优势。例如,遇到 I/O 操作时,协程自动挂起,让出 CPU 资源,待 I/O 完成后恢复执行。协程(Coroutine)是一种用户态的轻量级线程,由程序自身控制调度,而非操作系统内核。是 Java 19+ 引入的轻量级线程,由 JVM 调度,底层复用操作系统线程(载体线程)。操作系统线程是稀缺资源(通常最多几千个),而协程通过挂起机制,让少量线程服务海量任务。
2025-03-13 16:55:48
582
原创 Java 的 CopyOnWriteArrayList 和 Collections.synchronizedList 有什么区别?分别有什么优缺点?
问题:什么是 ?解答: 是 Java 并发包 () 提供的一种 线程安全 的 实现,它的核心特性是 写时复制(Copy-On-Write)。即,每当执行修改操作(如 、、)时,都会创建 一个新的数组,修改操作会在这个新数组上进行,操作完成后再将新数组赋值给 的内部变量。底层是一个 数组,存储数据时会复制数组。示例: 方法分析:示例: 方法分析: 通过 进行遍历:特点:示例:结论:适用于 读多写少 的场景,如:如果你的应用 读取操作远远多于写操作,可以考虑使用 来提高并发性能!🚀你的问题
2025-03-13 16:55:35
799
原创 ConcurrentHashMap 和 Hashtable 的区别是什么?
是 Java 早期的线程安全 实现,存储 键值对 (key-value),内部采用 数组 + 链表 实现 哈希表 (Hash Table) 结构。Hashtable 的特点特性说明线程安全使用 关键字,所有操作都是 同步 的,适用于多线程环境。不允许 键和值 会抛 ,与 不同。底层结构采用 数组 + 链表 处理哈希冲突(JDK 8 及以前)。默认负载因子 0.75当 时,触发扩容,新的容量是 原来的 2 倍 + 1。遍历顺序不保证稳定 不
2025-03-13 16:50:39
1036
原创 一文读懂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
674
原创 Java 中的序列化和反序列化是什么?
是用来确保类版本兼容性的标识符。推荐显式定义,以避免不同版本类之间的兼容性问题。如果类结构发生变化而不更新,可能导致反序列化失败。静态变量不会被序列化,因为它是属于类的,所有对象共享一个值,不依赖于实例状态。序列化只会保存对象实例的状态(即实例变量的值),静态变量的值是通过类的加载来获取的。序列化是一种数据转换过程,形式不仅限于字节流,还包括 JSON、XML 等。前后端交互通常以文本化序列化形式(如 JSON)进行传输,数据库存储时多以结构化或文档形式存储,而不是直接存储序列化的对象。
2025-03-13 16:48:10
1064
原创 Java 中的深拷贝和浅拷贝的区别
Java 中的深拷贝和浅拷贝有什么区别?浅拷贝(Shallow Copy):深拷贝(Deep Copy):浅拷贝可以通过实现 接口和重写 方法来实现。深拷贝示例深拷贝需要手动实现递归复制。注意点浅拷贝的风险:深拷贝的复杂性:深拷贝工具类:两者根据需求选择,灵活使用。 方法定义: 方法是 类中的一个 方法,声明如下:它是一个本地方法,底层由 JVM 实现,用于创建当前对象的浅拷贝。为什么使用 :如何生效:注意事项直接调用 的 会导致问题:浅拷贝:自定义深拷贝:通过 ,
2025-03-13 16:47:40
678
原创 Java 中的深拷贝和浅拷贝有什么区别?
Java 中的深拷贝和浅拷贝有什么区别?浅拷贝(Shallow Copy):深拷贝(Deep Copy):浅拷贝可以通过实现 接口和重写 方法来实现。深拷贝示例深拷贝需要手动实现递归复制。注意点浅拷贝的风险:深拷贝的复杂性:深拷贝工具类:两者根据需求选择,灵活使用。 方法定义: 方法是 类中的一个 方法,声明如下:它是一个本地方法,底层由 JVM 实现,用于创建当前对象的浅拷贝。为什么使用 :如何生效:注意事项直接调用 的 会导致问题:浅拷贝:自定义深拷贝:通过 ,
2025-03-13 11:48:08
740
原创 Java 中的参数传递是按值还是按引用?
Java 中,所有方法参数都是值传递。String的不可变性进一步确保了它的原始值不会被修改。理解String的不可变性和值传递的机制,有助于更好地编写和调试代码。类型传递方式方法内操作对原变量的影响基本数据类型值传递不会影响原变量不可变类引用值的副本传递不会影响原变量可变引用类型引用值的副本传递可能通过引用修改原变量指向对象的内部状态。
2025-03-12 15:45:01
1006
原创 Java 中 String、StringBuffer 和 StringBuilder 的区别是什么?
String:不可变,适合少量字符串操作。:可变且线程安全,适合多线程环境中的频繁字符串修改。:可变且非线程安全,适合单线程环境中的高性能字符串处理。粒度(Granularity)是指某种事物的划分或处理的精细程度。在计算机科学中,粒度被用来描述各种资源(如锁、任务、数据)分解的程度。粒度的大小直接影响性能和效率。分类与解释锁的粒度指锁住的资源范围的大小。粗粒度锁:锁住较大的资源范围(如整个对象或类)。优点:简单易用,减少死锁风险。缺点:降低并发性能,因为线程需要等待锁释放。
2025-03-12 15:44:30
877
原创 Java 中 hashCode 和 equals 方法是什么?它们与 == 操作符有什么区别?
哈希桶(Hash Bucket)是哈希表(Hash Table)中用来存储数据的一种结构。它是哈希表的核心组成部分,帮助解决哈希冲突问题。存储映射到相同哈希值的多个元素。每个哈希桶可以是一个简单的链表、数组、红黑树或其他数据结构,用来容纳冲突的元素。哈希桶通过哈希函数映射而成,数组的每个索引位置可以看作是一个桶。哈希桶是哈希表的基础单元,用于存储冲突的键值对。它通过链表、红黑树等结构解决了哈希冲突。Java 的HashMap利用哈希桶实现,结合链表和红黑树来优化性能。equals。
2025-03-12 15:43:45
597
原创 Java 中 Exception 和 Error 有什么区别?
![[Throwable.png]] 和 都是 类的子类(在 Java 代码中只有继承了 Throwable 类的实例才可以被 throw 或者被 catch)它们表示在程序运行时发生的异常或错误情况。总结来看: 表示可以被处理的程序异常, 表示系统级的不可恢复错误。详细说明:1)Exception:是程序中可以处理的异常情况,表示程序逻辑或外部环境中的问题,可以通过代码进行恢复或处理。常见子类有:、、、 等。 又分为 Checked Exception(编译期异常)和 Unchecked Except
2025-03-12 15:42:58
986
原创 Java 的IO 流是什么?
特性字节流字符流数据单位字节(8 位)字符(16 位,基于编码转换)主要类和Reader和Writer适用场景非文本数据(图片、音频、视频)文本数据(.txt.xml编码处理无自动处理字符编码与解码性能更高,直接操作二进制较低,需额外编码转换选择流类型时,根据要处理的数据类型和需求选择字节流或字符流即可。
2025-03-12 15:42:25
998
原创 Java 泛型的作用是什么?
泛型(Generics)是 Java 提供的一种语言机制,用于在编译时通过类型参数来增强代码的类型安全性和可读性。泛型允许开发者定义具有。
2025-03-12 15:41:48
931
原创 Java 的类加载过程是怎样的?
通过加载器,Java 能够在运行时灵活加载类,实现模块化设计、插件机制等功能。文件中的字节码加载到 JVM 中,并进行验证、解析和初始化,最终使类能够使用的过程。是 Java 虚拟机(JVM)中负责将类的字节码加载到内存中的组件。Java 的类加载过程实现了字节码的动态加载、验证与管理,保证了 Java 程序的安全性和平台无关性。加载器是 Java 动态类加载机制的核心部分,允许在运行时加载类,而不是在编译时确定所有类。类加载器负责查找并加载类的字节码。Java 的类加载过程是怎样的?
2025-03-12 15:41:14
682
原创 Java 的 Optional 类是什么?它有什么用?
什么是 Java 中的 Optional 类?Optional是 Java 8 引入的一个容器类,用于表示可能包含或可能不包含值的对象。它的主要目的是避免使用null引起的空指针异常(),并提供更好的语义化操作来处理值是否存在的场景。避免null引起的空指针异常,提高代码的可读性和可维护性。方法返回值可能为空时,优先使用Optional,明确表达返回值的状态。Optional 的引入让 Java 处理null的方式更安全、更优雅。Optional。
2025-03-12 15:40:40
1006
原创 BigDecimal 为什么能保证精度不丢失?
您理解正确:BigDecimal 使用 BigInteger 和 scale 分离数值和精度,通过十进制表示避免了浮点数的精度丢失问题,因此能够提供高精度计算。能够保证精度不丢失的关键在于其基于十进制的表示方式和严格的算术运算规则,而不会受到二进制表示的限制。是 Java 提供的一个用于高精度浮点运算的类,能够有效避免精度丢失问题。其高精度特性得益于它的内部实现机制和使用场景。您的理解基本准确,BigDecimal 通过内部的设计机制规避了浮点数转换的精度问题。明确规定了小数位的精度,防止精度丢失。
2025-03-12 15:40:05
866
原创 为什么 Java 不支持多重继承?
Java 不支持多继承的主要原因是为了避免钻石问题和方法冲突,同时简化代码设计,提升可读性和可维护性。通过接口和组合的方式,可以在保持代码清晰的前提下实现多继承的功能。Java 8 的接口默认方法确实可能导致类似的冲突,但由于接口是契约,Java 要求开发者显式解决冲突,因此可以避免传统多继承中的钻石问题。你的理解是正确的,子类没有重写冲突方法时才会报错;重写后不会有问题,行为符合子类的实现逻辑。问题:什么是方法签名?解答在 Java 中,方法签名是用来唯一标识一个方法的要素。方法的名称。
2025-03-12 15:39:34
983
原创 使用 new String(字符串) 语句在 Java 中会创建多少个对象?
使用 语句在 Java 中会创建多少个对象?当执行 时,涉及到以下两个可能的对象创建:字符串常量池中的对象(如果不存在):堆中的对象:具体情况分为两种:w常量池中已有 (之前的代码已引用过常量):常量池中没有 (第一次加载):以下代码可以帮助理解:注意事项 操作符的独立性:推荐做法: 至少会创建 1 个对象(堆中对象),如果 不在常量池中,则还会在常量池中创建 1 个对象,总共可能创建 1 或 2 个对象。Java 中分为基础数据类型和引用数据类型,对于它们在内存中的运行情况存在以下疑问:基
2025-03-12 15:37:19
744
原创 什么是 Java 中的动态代理?
动态代理是 Java 提供的一种机制,它允许在运行时动态创建代理类和对象,而无需手动编写代理类的代码。代理对象可以在不改变目标对象代码的情况下,为目标对象扩展功能。
2025-03-12 15:36:49
1009
原创 什么是 Java 中的不可变类?
不可变类是指在创建后其状态(对象的字段)无法被修改的类。一旦对象被创建,它的所有属性都不能被更改。这种类的实例在整个生命周期内保持不变。关键特征声明类为final,防止子类继承。类的所有字段都是private和final,确保它们在初始化后不能被更改。通过构造函数初始化所有字段。不提供任何修改对象状态的方法(如setter方法)。如果类包含可变对象的引用,确保这些引用在对象外部无法被修改。例如 getter 方法中返回对象的副本(new 一个新的对象)来保护可变对象。String。
2025-03-12 15:36:09
1401
原创 什么是 Java 的 SPI(Service Provider Interface)机制?
问题解答1. SPI 的概念SPI(Service Provider Interface)是 Java 提供的一种服务发现机制。它允许框架或应用程序通过定义一套接口,并让第三方开发者提供具体实现,从而实现模块化设计和动态扩展功能。服务接口与服务实现分离,服务消费者通过接口调用服务,而具体实现则通过配置文件动态加载。2. SPI 的工作原理定义服务接口创建一个接口,定义服务的标准行为。服务提供者实现接口第三方开发者根据接口编写具体实现类。通过配置文件声明服务实现在目录下,创建一个以接口全限定名。
2025-03-12 15:35:35
682
原创 你认为 Java 的优势是什么?
Java 程序的执行过程包括多个重要的阶段,从编译到字节码,到类加载和 JIT 编译,再到最终的内存管理和垃圾回收。
2025-03-12 15:34:54
567
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人