- 博客(83)
- 收藏
- 关注
原创 大模型开发
AI(人工智能)是使机器具备类人思考和解决问题能力的技术,其核心是Transformer神经网络模型(如GPT)。大模型应用结合传统编程实现记忆等复杂功能,应用开发技术包括Prompt问答、微调、Agent调用和RAG(外挂知识库),适用于客服、医疗、办公自动化等场景。AI通过数据训练掌握语言规律,处理模糊性问题,与传统程序互补形成强大应用。
2025-07-23 22:43:34
594
原创 Spring介绍以及IOC和AOP的实现
摘要:Spring框架是一个轻量级的开源Java框架,基于控制反转(IoC)和面向切面编程(AOP)两大核心技术。它通过IoC容器管理对象生命周期,使用DI实现松耦合;通过AOP实现日志、事务等横切关注点的分离。Spring包含核心容器、数据访问、WebMVC等多个模块,支持JDK动态代理和CGLIB两种代理方式。开发时只需定义切面类、切入点表达式和通知类型(@Before/@Around等)即可实现AOP功能,有效解耦业务代码与通用功能。Spring自2004年发布以来,已成为Java企业应用开发的事实标
2025-07-18 22:02:55
1565
1
原创 缓存三兄弟和布隆过滤器
摘要:缓存问题三兄弟(穿透、击穿、雪崩)及其解决方案是系统优化的关键。缓存穿透采用布隆过滤器拦截非法请求或缓存空对象;缓存击穿通过分布式锁或逻辑过期时间解决热点Key失效问题;缓存雪崩则采用随机过期时间、集群部署和熔断降级等策略。布隆过滤器作为空间效率高的数据结构,通过多哈希映射实现高效存在性判断,虽存在误判率,但在缓存防护、数据去重等场景表现优异。理解其原理、应用场景及与哈希表的区别对系统设计至关重要。
2025-07-16 19:24:28
525
原创 乐观锁的介绍
摘要:乐观锁是一种高效的并发控制机制,通过版本号/时间戳实现数据一致性检查,适用于低冲突、高并发场景。核心流程包括读取数据、修改并提交更新时验证版本号,冲突时支持自动重试(3-5次为宜)、用户介入或业务合并三种处理策略。需注意避免ABA问题,在分布式系统中结合全局唯一版本号,控制事务时长以减少冲突。其优势在于无锁设计带来的高吞吐,但需合理设置重试次数并处理版本回绕风险,最终确保数据正确性。
2025-07-16 19:19:59
237
原创 如何设计多个非重复键值对要存储HashMap的初始化以及常见的HashMap方法源码解析
摘要:本文详细解析了HashMap的关键操作和优化策略。删除操作(remove)通过遍历链表或红黑树定位元素后删除,当红黑树节点数小于6时会转为链表。查找操作(get)先检查桶的首节点,再处理冲突节点(树或链表)。遍历推荐使用entrySet()方式,效率最高。初始化容量建议设为(元素个数/0.75)+1,可减少扩容次数,权衡内存换取性能。HashMap会自动将初始容量调整为2的幂次方,扩容阈值为容量×负载因子(默认0.75)。
2025-07-15 19:13:03
693
原创 HashMap中哈希值的计算方法和扩容机制
本文剖析了HashMap的哈希计算和扩容机制。哈希计算方法将key的hashCode高16位与低16位异或,以均匀分布哈希值。HashMap默认负载因子为0.75,当元素超过阈值时会扩容为原数组的2倍。扩容时采用巧妙的重哈希策略:通过判断新增bit位是0或1,决定元素留在原位置或迁移到"原位置+旧容量"位置。这种设计避免了完全重算哈希值,同时保证冲突节点均匀分散。当链表长度达到8且数组未达64时会先扩容,超过64则转为红黑树;节点数低于6时又会转回链表。优化扩容策略对提升HashMap性
2025-07-15 19:07:11
1025
原创 HashMap的长度为什么要是2的n次幂以及HashMap的继承关系(元码解析)
摘要:HashMap在Java集合框架中采用2的幂次方作为默认容量(16),主要因为hash&(length-1)的位运算能高效替代取模运算,减少哈希冲突。当数组长度为2的幂时,哈希值低位充分参与运算,索引分布更均匀;若长度非2的幂,会导致索引范围压缩,增大碰撞概率。此外,HashMap存在继承父类AbstractMap又实现Map接口的设计失误,由于不影响功能而未修正。这些设计体现了Java在哈希表实现中对性能优化和兼容性的权衡。(149字)
2025-07-14 22:14:39
302
原创 HashMap的put过程以及hashMap的简单介绍
本文介绍了HashMap的基本原理和实现机制。HashMap采用数组+链表+红黑树(JDK1.8后)的数据结构,键值允许为null但键唯一。主要特点包括:初始容量16(JDK8后首次put时创建),哈希冲突时通过equals比较处理,当链表长度超过8且数组长度大于64时转换为红黑树以提高查询效率。扩容机制为双倍增长,临界值为容量乘以加载因子(默认0.75)。put操作包含空数组检测、哈希计算、冲突处理(覆盖或新增节点)、树化判断等步骤,完整展现了HashMap的核心运作流程。
2025-07-14 22:07:38
397
原创 JVM的垃圾回收算法和多种GC算法
摘要:JVM垃圾回收(GC)主要作用于新生区、养老区和元空间,其中新生区回收最为频繁。GC分为轻GC和重GC两种类型。常用的GC算法包括:复制算法(适用于新生区,无内存碎片但空间利用率低)、标记清除算法(空间利用率高但会产生碎片)和标记压缩算法(优化后的标记清除)。不同算法各有优劣,需根据场景选择:年轻代使用复制算法,老年代采用标记清除压缩算法。GC参数如MaxTenuringThreshold可调整对象进入养老区的阈值。(147字)
2025-07-12 21:22:45
415
原创 堆内存的详细结构以及java中内存溢出和排查方式
本文介绍了三种主流JVM(HotSpot、JRockit、IBM J9)的基本特性,重点分析了堆内存结构及其优化策略。堆内存分为新生代、老年代和元空间(取代永久代),各自采用不同的GC算法。文章通过代码示例演示了内存溢出(OOM)的模拟和排查方法,包括使用JProfiler工具分析dump文件。还讲解了JVM内存参数调优技巧,如设置初始/最大堆内存(-Xms/-Xmx)和打印GC日志(-XX:+PrintGCDetails)。最后通过实例展示了如何快速定位OOM问题,为JVM性能优化提供了实用指导。
2025-07-12 20:12:28
1197
原创 深入理解栈和java栈溢出以及实例对象创建时内存的变化(图解)
摘要:本文介绍了栈的特点和运作原理,重点分析了栈溢出(StackOverflowError)的形成原因。通过Java代码示例演示了方法递归调用导致的栈溢出情况。文章详细讲解栈帧结构及其包含的各类信息,包括方法索引、输入输出参数、本地变量等。同时阐述了栈、堆、方法区的交互模型和各自功能:栈负责方法执行时的临时数据,堆存储对象实例,方法区保存类元数据。最后以一个People类实例化的完整过程,展示了对象在内存中的创建和访问机制,说明栈如何通过地址引用访问堆中的对象实例。
2025-07-12 13:53:01
392
原创 java底层的native和沙箱安全机制
沙箱安全机制是一种隔离程序运行环境的技术,通过资源隔离、权限控制和行为监控来限制潜在恶意代码的危害。其核心是将不可信代码限制在受控环境中运行,防止其对系统关键资源(如文件系统、网络)的非法访问。典型应用包括浏览器隔离网页脚本、移动应用数据保护及软件开发测试。此外,文章还简要提及Java中的native关键字原理,说明其通过JNI调用底层C/C++库,以及JVM内存结构中程序计数器和方法区的作用,强调方法区作为线程共享区域存储类信息、常量等数据。
2025-07-11 22:26:55
979
原创 JAVA程序的类加载器的底层和双亲委派机制的原理
文章摘要:Java类加载器采用层级结构(Bootstrap、Platform/Extension、Application和自定义加载器),通过双亲委派机制确保类加载的安全性和唯一性。该机制要求子加载器优先委派父加载器处理请求,父类无法完成时才自行加载。示例显示,当加载用户类时会从ApplicationLoader向上逐级委托,最终由能处理的加载器执行。这种设计有效防止核心类被篡改,并保证类的全局唯一性。Java 9后用PlatformClassLoader取代了ExtensionClassLoader,但机
2025-07-11 12:45:54
674
原创 JVM的位置和JVM的结构体系
摘要:JVM位于JRE内,介于操作系统和Java应用程序之间,实现跨平台运行。其体系结构包含类加载子系统、运行时数据区(方法区、堆、栈等)、执行引擎和本地方法接口。其中方法区和堆是垃圾回收调优的主要区域,而程序计数器、栈等不会产生垃圾。JVM通过将字节码翻译为机器指令,并借助本地方法库实现底层交互,确保Java程序高效运行。(149字)
2025-07-05 19:41:19
1082
原创 java的注解和反射
文章摘要:本文介绍了Java注解和反射机制的核心概念。注解从JDK5引入,用于程序解释,包含内置注解(@Override等)和元注解(@Target等)。反射使Java具备动态性,允许运行时获取类信息并操作对象。通过Class对象实现反射,包括对象创建、方法调用等功能。类加载过程分为加载、验证、准备、解析和初始化阶段,最终在堆内存生成Class对象。反射提高了灵活性但影响性能,需权衡使用。
2025-07-05 17:37:14
1245
原创 死锁的排查以及公平锁,非公平锁,可重入锁,自旋锁的介绍
死锁是线程相互等待对方资源导致的阻塞现象,可通过jps和jstack工具诊断。本文介绍了Java中的几种锁机制:公平锁与非公平锁的主要区别在于是否允许插队执行,ReentrantLock通过构造参数区分;可重入锁允许同一线程重复获取锁,如synchronized和ReentrantLock;自旋锁通过CAS机制实现(如AtomicReference),会循环尝试获取锁;文章通过代码示例展示了各种锁的实现方式和使用注意事项。
2025-07-04 12:24:39
370
原创 CAS的底层和ABA问题
摘要:CAS(Compare-And-Swap)是一种原子操作,通过比较内存值与预期值来决定是否更新。文中通过AtomicInteger的compareAndSet方法演示了CAS机制,并分析了其底层Unsafe类的实现原理。同时指出CAS存在ABA问题(值被修改后恢复原值导致检测失效),并通过AtomicStampedReference引入版本号机制来解决该问题。最后提醒注意Integer缓存范围(-128~127)可能带来的对象复用问题。
2025-07-04 12:20:00
692
原创 Volatile解决指令重排和单例模式
指令重排是程序执行过程中的重要优化手段,涉及编译器优化、指令并行和内存系统三个层面。处理器在执行时会考虑数据依赖性,但多线程环境下仍可能出现意外结果(如x=2,y=1)。使用volatile关键字可以防止指令重排,通过内存屏障保证可见性但不保证原子性。单例模式实现中,饿汉式可能浪费资源,而懒汉式在多线程环境下需注意指令重排问题。典型的双重检测锁实现需要对实例变量加volatile修饰,避免new操作(包含内存分配、初始化和引用赋值三个步骤)被重排序导致线程安全问题。
2025-07-04 12:14:16
383
原创 Volatile关键字的特点以及JMM意义
Java中的volatile关键字是轻量级同步机制,主要提供可见性和禁止指令重排功能,但不保证原子性。JMM(Java内存模型)定义了主内存与工作内存的交互规则,包括8种同步操作:lock/unlock、read/load、use/assign、store/write。volatile能确保变量修改立即可见,如示例1所示;但在多线程累加场景(示例2)会出现原子性问题。此时可使用原子类(如AtomicInteger)替代volatile来解决,避免使用重量级锁。这些机制共同保障了Java多线程环境下的数据一致
2025-07-03 22:15:58
684
原创 异步回调Future
摘要:CompletableFuture是Java中实现异步回调的重要工具。文章展示了两种使用方式:无返回值的runAsync()和有返回值的supplyAsync()。当任务成功时返回1024,失败时捕获异常返回233。通过whenComplete()处理结果和异常,exceptionally()处理错误情况。这种异步机制适用于需要返回状态码(如成功200/失败500)的场景,实现非阻塞编程。代码示例演示了异步回调的核心用法,包括线程休眠、异常处理和结果获取。
2025-07-03 13:00:00
319
原创 idea怎么实现ForkJoin
摘要:分支合并(ForkJoin)是一种将任务拆分为多个子任务并行执行,最后汇总结果的编程模式。其核心特点是工作窃取机制,空闲线程可以窃取其他线程队列中的任务。使用时需继承RecursiveTask(有返回值)或RecursiveAction(无返回值),重写compute方法实现任务拆分逻辑。示例展示了计算大数求和的实现,通过设置临界值优化性能。相比线程池,ForkJoinPool提供submit(异步)和execute(同步)两种提交方式。补充说明Java8的Stream并行流(parallel())也
2025-07-02 17:51:52
459
原创 Stream流式计算
本文介绍了Java中Stream流式计算的使用方法,通过一个用户数据处理案例展示了流式编程的优势。示例代码演示了如何利用Stream的filter、map、sorted等操作链式组合实现:筛选ID为偶数、年龄大于23的用户,将用户名转为大写并按字母倒序排序,最终只输出一个结果。这种流式处理方式不仅简化了代码结构,还提高了数据处理效率。文章强调Stream流式计算是Java开发中需要重点掌握的核心技能,配合Lambda表达式和函数式接口能显著提升代码质量和开发效率。
2025-07-02 15:47:01
358
原创 四大函数式接口
Java函数式编程接口示例:1) Function接口实现参数转换;2) Predicate接口进行条件判断;3) Consumer接口处理输入无返回值;4) Supplier接口提供输出无参数。每个示例都展示了传统匿名类和Lambda表达式两种实现方式。这些接口简化了函数式编程,通过Lambda表达式使代码更简洁。
2025-07-02 08:00:00
167
原创 阻塞队列BlockingQueue的常用方法和相关含义
摘要:BlockingQueue是Java集合框架中用于多线程并发的重要接口,继承自Collection。它提供了4组API实现线程安全操作:1)抛出异常(add/remove/element),2)返回布尔值(offer/poll/peek),3)阻塞等待(put/take),4)超时等待(offer/poll带时间参数)。示例代码展示了LinkedBlockingQueue的基本用法,包括不同方式的元素添加、移除和检测操作。这些特性使BlockingQueue特别适合线程池等并发场景。
2025-07-01 15:19:36
354
原创 多线程常用的辅助类
摘要:本文介绍了Java中三个并发工具类的用法:1)CountDownLatch(减法计数器),通过await()等待线程完成并计数归零后继续执行;2)CyclicBarrier(加法计数器),当线程数达到设定值时触发新线程执行任务;3)Semaphore(信号量),用于控制并发线程数,通过acquire()和release()实现资源互斥访问和限流。文中通过代码示例展示了每个工具类的典型应用场景:CountDownLatch用于线程同步,CyclicBarrier实现多线程集合点,Semaphore管理资
2025-06-26 20:11:39
347
原创 Callable
摘要:本文介绍了Java中Callable接口的使用方法。与直接使用Thread不同,Callable需要通过Runnable作为中介来创建线程,类似于通过朋友认识新朋友的方式。FutureTask类作为Runnable和Callable之间的桥梁,示例代码展示了如何通过FutureTask启动Callable线程并获取返回值(110)。需要注意的是futureTask.get()可能造成阻塞,且结果会被缓存。这种机制提供了比Runnable更灵活的线程返回值获取方式。
2025-06-26 20:08:01
159
原创 线程安全问题
本文讨论了Java集合类在多线程环境下的线程安全问题及解决方案。对于List和Set集合,可使用Vector、Collections.synchronizedList/synchronizedSet或CopyOnWriteArrayList/CopyOnWriteArraySet来保证线程安全,其中CopyOnWrite采用写入时复制策略避免数据覆盖。针对HashMap,推荐使用ConcurrentHashMap,其通过细粒度锁(仅锁定冲突的哈希桶)、CAS原子操作和volatile变量实现高效并发,相比H
2025-06-26 17:11:08
410
原创 synchronized到底是怎么锁的
通过7个Java多线程案例分析synchronized关键字的使用效果。一篇完全了解synchroized的使用。要点包括:1)synchronized锁住的是对象而非方法,线程执行顺序取决于谁先获取锁;2)非同步方法不受锁限制;3)不同对象的方法调用互不影响;4)static方法锁定的是类本身,所有对象共享同一把锁;5)静态和非静态方法分别锁定类和对象,彼此互不干扰。
2025-06-26 14:54:41
385
原创 JUC版的生产者和消费者
本文对比了传统synchronized和使用JUC包实现生产者-消费者模式的区别。代码示例展示了通过ReentrantLock和Condition实现三个线程(A、B、C)的精确协作。每个线程等待特定条件(number值)满足才执行,并通过signal()方法精确唤醒下一个线程,避免了synchronized只能随机唤醒的问题。关键点包括:1)使用Lock替代synchronized;2)通过Condition实现精准线程唤醒;3)三个线程按A→B→C顺序交替执行。这种方案相比synchronized具有更
2025-06-25 22:07:15
304
原创 普通版的生产者消费者
摘要:文章展示了Java中生产者-消费者模式的多线程实现,揭示了使用if判断时可能出现的虚假唤醒问题。当多个线程操作共享数据时,if语句只进行一次判断,会导致累加/累减错误。解决方案是将if改为while循环,确保每次被唤醒后都重新检查条件。修改后的代码通过while循环和wait/notifyAll机制,实现了线程安全的同步操作,有效防止了虚假唤醒。该示例突出了多线程编程中条件判断的注意事项。
2025-06-25 22:05:43
259
原创 Lock锁和synchronized锁
摘要:本文对比了Java中两种线程同步机制——synchronized关键字和Lock接口。synchronized作为内置关键字,通过锁定变化量保证线程安全,但无法判断锁状态且自动释放;Lock接口作为Java类,需手动加锁解锁,可判断锁状态,灵活性更高。两种锁都是可重入的,但synchronized是非公平锁且不可中断,而Lock可实现公平锁并支持中断。synchronized适用于少量代码同步,Lock更适合处理大量同步代码。文章通过售票示例展示了两种锁的具体应用方式。
2025-06-24 21:24:15
340
原创 JUC并发编程
摘要:Juc(java.util.concurrent)是Java用于线程操作的三个核心包。进程是程序集合,线程是进程中的执行单位(如视频播放时同时看弹幕和点赞)。Java默认有main线程和GC线程,通过Thread/Runnable/Callable实现线程操作,但实际开启线程需通过native方法start0()调用C++底层。并发指多线程操作同一资源,并行指多线程同时运行。可通过Runtime.getRuntime().availableProcessors()查看CPU核数,并发编程旨在充分利用C
2025-06-24 20:07:40
379
原创 线程协作和线程池
摘要:生产者消费者模式是经典的线程同步问题,通过共享缓冲区协调生产与消费。生产者向缓冲区放入产品,消费者从中取出,当缓冲区满或空时使用wait()/notify()机制实现线程等待与唤醒。文中以Java代码实现了一个基于管程法的生产者消费者模型,采用循环队列作为缓冲区,通过synchronized保证线程安全。同时介绍了线程池技术,使用ExecutorService和Executors创建线程池,提高线程复用效率,降低资源消耗。示例展示了固定大小线程池执行Runnable任务的过程,体现了线程池管理线程的优
2025-06-22 18:49:26
769
原创 Lock锁
Java从JDK5.0开始引入更强大的线程同步机制——Lock锁,通过显式控制锁对象实现同步。Lock接口提供了独占访问控制,其实现类ReentrantLock与synchronized具有相同并发性但更灵活。示例代码展示了使用ReentrantLock保护共享变量counter,通过lock()/unlock()确保线程安全,且必须在finally块中释放锁。相比synchronized隐式锁,Lock具备代码块锁、更优性能和扩展性,建议优先使用Lock、同步代码块,最后考虑同步方法。
2025-06-22 18:47:39
165
原创 死锁的产生
摘要:死锁是指多个线程互相等待对方释放资源而陷入僵持的状态。示例代码展示了两个线程分别持有lock1和lock2,同时请求对方持有的锁,导致循环等待。死锁产生的四个必要条件是:资源互斥、请求保持、不可剥夺和循环等待。要避免死锁,需要破坏其中至少一个条件。该案例典型地展示了线程间因不当的同步顺序而产生的死锁问题。
2025-06-22 18:45:54
483
原创 线程同步机制
线程同步机制(如synchronized)解决了多线程访问共享资源时的冲突问题。通过加锁确保同一时间只有一个线程访问资源,但会带来性能损耗和优先级倒置等问题。同步包括方法和代码块两种形式:同步方法自动以当前对象为锁,而同步块可以灵活指定锁对象。使用时应仅在必要代码段加锁以避免资源浪费。同步监视器控制线程访问流程:先锁定再执行,解锁后其他线程才能访问。合理使用同步机制对保证线程安全至关重要。
2025-06-22 18:44:05
162
原创 线程的状态
Java线程状态及管理摘要:Java线程生命周期包含新生、就绪、运行、阻塞和死亡五种状态。通过标志位volatile变量实现线程安全终止是最佳实践,应避免使用废弃的stop()方法。线程优先级(1-10)影响调度概率但不保证执行顺序,守护线程会在用户线程结束时自动终止。示例代码展示了如何使用标志位控制线程终止,当循环计数达到900时通过设置flag=false安全停止线程。线程优先级应在start()前设置,而守护线程特性适用于不需要等待执行完成的后台任务。这些机制为多线程编程提供了灵活的状态管理和资源调度
2025-06-22 18:42:25
363
原创 Lamda表达式
Java8的Lambda表达式简化了函数式接口的实现,通过逐步演化(实现类→匿名内部类→Lambda)使代码更简洁。Lambda支持参数类型推断,单参数时可省略括号,单行语句可省略花括号。文中展示了从传统实现到Lambda的各种写法对比,包括带返回值和使用Runnable线程的示例。Lambda适用于只有一个抽象方法的函数式接口,大幅提升了Java的函数式编程能力。
2025-06-22 18:41:03
705
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人