- 博客(26)
- 收藏
- 关注
原创 Spring 核心注解深度分析
Spring框架的核心幼稚之一是通过注解驱动简化配置,实现组件解耦和功能扩展,注解本质就是元数据标记,Spring容器通过注解解析器识别这些标记,完成组件注册、依赖注入、事务管理等核心功能。
2025-11-21 19:52:47
762
原创 JVM(Java 虚拟机):核心原理、内存模型与调优实践
JVM 的核心是 “内存管理 + 垃圾回收”,掌握其内存模型、GC 原理、类加载机制是调优的基础。依据业务场景(吞吐量 / 低延迟)选择合适的 GC 收集器和参数;避免盲目调优,先通过监控工具定位问题(如 OOM、频繁 GC),再针对性优化;优先优化代码(如避免内存泄漏、减少大对象),再调整 JVM 参数;生产环境建议开启 GC 日志和 OOM 堆快照,便于问题排查。JVM 调优是一个 “迭代优化” 的过程,需结合实际业务压力测试,逐步调整参数,达到最优性能。
2025-11-21 09:04:53
827
原创 线程池的概念
线程池的核心价值是线程复用 + 资源控制,解决了直接创建线程的开销和资源耗尽问题。按任务类型(CPU/IO 密集型)合理配置核心参数;生产环境优先使用,避免Executors;配置有界队列和合理的拒绝策略,防止 OOM;做好监控和优雅关闭,避免线程泄露和数据不一致。
2025-11-21 08:55:29
338
原创 notify()和notifyAll()有什么区别?
摘要:Java中notify()和notifyAll()的主要区别在于唤醒线程的数量和行为。notify()随机唤醒一个线程,适合等待条件相同的场景,但可能引发线程饥饿;notifyAll()唤醒所有线程,确保所有线程都有机会检查条件,但会增大锁竞争开销。二者都需在synchronized块中调用,唤醒后线程需重新获取锁才能执行。核心原则是:不确定时优先使用notifyAll()以避免阻塞风险,明确所有线程任务一致时可使用notify()提升性能。(149字)
2025-11-19 10:05:27
636
原创 什么是多线程死锁,如何预防和解决?
多线程死锁是指两个或多个线程在执行过程中因争夺资源而造成的一种互相等待的现象,导致这些线程都无法继续执行。互斥条件:资源一次只能被一个线程占用。占有并等待:线程持有至少一个资源,同时等待获取其他被占用的资源。不可剥夺:线程已获得的资源在未使用完之前不能被其他线程强行抢占。循环等待:存在一个线程的循环链,每个线程都在等待下一个线程所占用的资源。
2025-11-18 19:27:56
242
原创 synchronized的作用什么
是 Java 中的关键字,主要用于实现线程同步,确保多线程环境下对共享资源的访问安全。块或方法前,线程会清空工作内存中的变量副本,从主内存重新加载数据;退出时会将修改后的值同步到主内存,从而确保其他线程能立即看到最新值。修饰的代码块或方法在同一时间只能被一个线程执行,确保操作的原子性。通过互斥锁防止指令重排序优化破坏代码的逻辑顺序,确保代码执行顺序与程序顺序一致。需显式指定锁对象(可以是任意对象),灵活控制同步范围。),同一实例的多个线程会竞争同一把锁。),所有实例的线程会竞争同一把锁。
2025-11-18 19:24:59
324
原创 Sleep()和wait()的区别
sleep()属于Thread类,是线程 "自身休眠" 的工具,不涉及锁机制;wait()属于Object类,是 "锁对象" 提供的线程通信机制,必须与锁配合使用。这种类归属的差异,本质上是 "单个线程控制" 与 "多线程协作" 两种设计目标的体现。理解这一点,就能从根本上区分两者的用法和场景。
2025-11-17 08:37:34
386
原创 线程、进程、程序的定义以及区别
程序 → 进程:程序被加载到内存执行时成为进程,一个程序可以对应多个进程(如多次启动同一个应用)。进程 → 线程:一个进程至少包含一个线程(主线程),可创建多个线程并发执行,线程是进程的 "子任务单元"。
2025-11-14 08:40:13
247
原创 在JAVA多线程有几种方式
当需要创建大量线程时,频繁创建和销毁线程会消耗大量系统资源。线程池通过预先创建一定数量的线程,复用线程执行多个任务,提高性能和资源利用率。方法),通过实现该接口可以定义线程任务,再将任务传递给。类似,但它可以返回任务执行结果,并且能抛出异常。类是 Java 中线程的基础类,通过继承它并重写。方法是线程的入口点,线程启动后会自动执行该方法。包提供的线程池框架实现,核心接口是。适用于需要返回结果的场景,而继承。接口可以获取异步任务的结果。方法可以定义线程执行逻辑。是一个函数式接口(仅含。
2025-11-14 08:37:30
828
原创 HashMap为什么用key作为键
HashMap用 key 作为 “键”,本质是由其“哈希表的底层原理”和“键值对的功能定位”哈希表需要通过一个 “唯一标识” 计算存储位置并解决冲突,key 恰好满足 “唯一性、可哈希、可比较” 的要求;键值对的核心是 “通过标识找数据”,key 是标识,value 是数据,角色分工天然决定了 key 作为 “键” 的必然性。key 是 “定位器”,value 是 “目标数据”,没有定位器,就找不到数据 —— 这就是 HashMap 用 key 作为键的根本原因。
2025-11-13 02:47:33
849
原创 ConcurrentHashMap和Hashtable的区别
ConcurrentHashMap是Hashtable的现代替代方案,通过细粒度锁(或者无锁机制)实现高效并发,同时支持更多原子操作和弱一致性迭代,性能和功能均远抄Hashtable,实际开发汇总,应该有优先使用ConcurrentHashMap处理并发场景。以哈希桶(数组元素)为单位加索:当线程操作某一个桶的时候,只对这个桶的头节点加synchronized锁,其他的桶可以正常访问,同时结合CAS操作(无所机制)优化读操作和简单写入,进一步提升性能。并发度理论上等于哈希桶数量,锁粒度更细,竞争更小。
2025-11-11 22:11:33
333
原创 HashMap深层结构
HashMap的核心是“数组 + 链表 / 红黑树”的混合结构,通过哈希值快速定位元素,用链表和红黑树处理冲突,通过扩容保证效率。其设计充分利用了哈希表的特性,同时通过红黑树优化极端场景下的性能,是 Java 中最常用的集合类之一。
2025-11-11 21:40:45
857
原创 什么是面向对象
面相对象本质上是一种模块化和抽象化的思维用类抽象同类事物的共性,用对象表示具体个体用封装明确模块边界,隔离变化用继承和组合实现代码复用,减少冗余用多态统一接口,提高扩展性。
2025-11-10 09:00:34
608
原创 HashMap和HashTable的区别
现成不安全,在多线程环境下,并发修改(如果溶蚀进行put和get)可能导致数据不一致或者ConcurrentModificationException。迭代器是安全失败(fail-safe)的其枚举器(Enumerator)不支持并发修改检测,迭代过程中集合的修改不会抛出异常(但可能读取到旧数据)迭代器是快速失败(fail-fast)的,当迭代过程中集合被修改(如添加/删除元素),会立即抛出。线程安全,所有方法都被synchronized修饰,保证了多线程操作的原子性,但是也牺牲了性能。
2025-11-09 23:36:32
302
原创 常用集合以及区别
Java中的集合框架(Java.util包)提供了多种数据结构,用于存储和操作对象的集合,常用集合可以分为List,Set,Map三大体系,它们在功能和特性上有明显的区别。Map用于存储键值对(key-value),键(key)不允许重复,值(value)可以重复,键和值都可以为null(TreeMap键不能为null)Set是无序集合(元素存入顺序与取出顺序不一定一致),不允许存储重复元素(通过equals()和hashCode()判断)1、ArrayList(最常用)3、Vector(古老类,少用)
2025-11-06 20:28:36
742
原创 throw和throws的区别
throw是一个语句,用于在方法内部主动创建并抛出一个具体的异常实例,表示程序在当前位置发生了一场。throws声明可能抛出的异常,不保证一定会抛出。
2025-11-06 19:45:05
341
原创 什么是序列化,什么情况下使用序列化
Java 序列化是 Java 语言提供的一套机制,用于将内存中的对象状态转换为可存储或可传输的字节序列,使得对象可以脱离程序运行时的内存环境而存在。反序列化则是其逆过程,将字节序列重新恢复为内存中的对象。这一机制是 Java 实现对象持久化和跨边界数据交换的核心技术。
2025-11-05 11:15:30
583
原创 Java反射
反射式java中动态性的核心实现,但不应滥用框架开发、通用工具等场景适合用反射提升灵活性业务逻辑代码应优化直接调用(性能更好、更容易维护)使用的时候需要注意性能优化(如果缓存反射对象)和安全控制反射的本质是用复杂性换去灵活性那个,合理使用能极大提升代码的扩展性,但过渡使用会导致系统难以维护和调试。
2025-11-05 10:32:59
354
原创 阻塞I/O,非阻塞I/O,I/O复用
I/O(输入/输出)是计算机系统中核心的操作之一,涉及数据在内存与外部设备(如磁盘、网络等等)之间的一些传输,阻塞I/O,非阻塞I/O和I/O复用是三种常见的I/O处理模式,它们在性能和适合场景上有显著差异。定义:通过一个系统调用同时监控多个I/O文件描述符(如socket),当某个或某些描述符就绪(数据可读/可写)时,内核通知应用程序进行处理。定义:当应用程序执行I/O操作时,在数据准备完成前,当前线程会被挂起(阻塞),无法执行其他任务,直到I/O操作完成后才继续执行。
2025-11-03 09:01:35
720
原创 什么是泛型
假如你需要一个装东西的盒子,如果没有泛型思维,你可能需要分别制作装苹果的盒子,装书本的盒子,装手机的盒子,每种盒子只能装一种物品,重复并且低效,而泛型就像一个可以定制的盒子,可以在使用时明确她是装什么东西的盒子,这样复用了盒子的结构,又保证了只能装指定物品,避免混乱。没有泛型的时候,从Object类型集合取数组必须强制转换(比如(int) list.get(0))有泛型后,编译器已经知道了这类型,直接获取就可以了,代码更简洁,不容易出错。的范围(如 “只能是数值类型”“必须实现某个接口”),这就需要。
2025-11-01 11:11:42
762
原创 JDK常用的工具清单
生成自签名证书:keytool -genkeypair -alias mycert -keyalg RSA -validity 365 -keystore mykeystore.jks(有效期365天,存储到mykeystore.jks)查看证书信息:keytool -list -keystore mykeystore.jks(输入密码后查看证书详情)指定输出目录:javadoc -d ./doc *.java(将文档输出到doc文件夹)1.javadoc(生成API文档)2.java(运行)
2025-10-31 10:27:32
309
原创 Static关键字的作用
static成员属于类,而非对象,节省内存(单份拷贝)生命周期与类绑定,独立于对象的创建/销毁访问无需实例化,适合定义工具方法、共享状态等场景一、静态成员的内存模型1.内存分配时机类加载的时候,静态变量/方法会被分配到方法区(JDK8后为元空间),而实例变量存储到堆内存中方法区是线程共享的内存区域,因此静态成员本质上是全局共享资源,所有对象操作的都是同一份数据// 方法区int b = 20;// 堆内存(每个对象独立)2.初始化顺序。
2025-10-31 09:53:05
548
原创 Java中常用的包
Object:所有类的根类,定义了 equals ()、hashCode ()、toString () notify()、getClass()、wait()、clone()Java.lang是属于java的一个核心包,它包含了Java程序运行必不可少的基础类型,这些类不用显式导入就可以在程序中使用(Java会自动导入这个包中的所有类)Java.util是Java标准库中一个非常重要的包,包含了大量实用的工具类,集合框架,日期时间处理,随机数生成等功能。System:提供系统级操作,输入输出,垃圾回收。
2025-10-31 09:09:39
524
原创 MyBatis框架搭建
使用Maven创建一个Web项目在项目的pom.xml文件中,配置项目需要依赖的jar包,将mybatis、日志组件log4j以及MySQL数据库驱动文件配置到pom.xml文件的dependencies节点下。MyBatis框架的核心配置文件主要用于配置连接数据库的相关信息及影响MyBatis框架运行时行为的属性。路径:src/main/java/resources/mapper/SQL映射文件.xml。路径:src/main/java/com/mapper/Mapper接口。
2025-10-28 10:53:48
220
原创 【Java基础】java的自动装箱和自动拆箱是什么?
在 Java 中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是用于基本数据类型与对应的包装类之间自动转换的机制,目的是简化代码编写。
2025-10-27 10:53:08
273
原创 Java开发工程
算数运算符:+、-、*、/、%、++、-- 如果++或--在变量前,先执行自增或自减操作 ++、--在变量后先使用变量进行计算。语法:if(条件表达式){代码块} if(条件表达式){代码块:1}else{代码块二}嵌套if选择结构:if(条件1){if(条件2{代码块1}else{代码块2}}else{代码块3}变量命名的规范:变量名的组成 变量名由任意数量的字母、数字、下划线、“_”或$符号组成。变量不能被重复明命名 非法变量:data% 或数字开头的变量都属于非法变量。
2025-10-27 10:40:05
241
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅