自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Vinfol的博客

Vinfol的博客

  • 博客(66)
  • 收藏
  • 关注

原创 【JAVA】55. 并发性能优化:降低锁粒度与减少竞争

锁粒度指的是在并发编程中,锁所保护的代码范围大小。锁粒度可以分为粗粒度锁和细粒度锁。粗粒度锁保护的代码范围较大,多个操作可能会被包含在同一个锁的范围内;细粒度锁保护的代码范围较小,只对必要的操作进行加锁。

2025-06-22 08:15:00 1044

原创 【JAVA】54. 无锁编程与Disruptor高性能队列

无锁编程是一种并发编程技术,它不使用传统的锁机制(如关键字或Lock接口)来保证线程安全,而是通过原子操作和 CAS(Compare - And - Swap)算法来实现。无锁编程的主要优点是避免了锁带来的上下文切换和线程阻塞开销,从而提高了并发性能。Disruptor 是一个开源的高性能队列,它是为了解决高并发场景下的消息传递问题而设计的。Disruptor 使用了无锁编程技术,通过环形数组和 CAS 算法来实现高效的并发访问。高性能:避免了锁的使用,减少了上下文切换和线程阻塞开销,提高了并发性能。

2025-06-21 09:00:00 637

原创 【JAVA】53. 指令重排序与内存屏障实现原理

指令重排序是指编译器或处理器为了提高程序的性能,在不改变程序语义的前提下,对指令的执行顺序进行重新排列的优化技术。编译器重排序:编译器在编译阶段对代码进行优化时,可能会对指令的顺序进行调整。例如,编译器可能会将一些独立的指令进行交换,以提高指令的并行度。指令级并行重排序:现代处理器为了提高指令的执行效率,会采用指令级并行技术,将多条指令并行执行。在这个过程中,处理器可能会对指令的执行顺序进行重排序。内存系统重排序:由于处理器使用缓存和读写缓冲区,使得内存操作的执行顺序可能与程序代码的顺序不一致。

2025-06-20 09:00:00 855

原创 【JAVA】52. Java内存模型(JMM)与happens - before规则

Java内存模型(Java Memory Model,JMM)是一种抽象的概念,它定义了Java程序中各个变量(包括实例字段、静态字段和数组元素)的访问规则,以及在多线程环境下如何保证数据的可见性、原子性和有序性。JMM的主要目的是解决多线程环境下的数据一致性问题,屏蔽不同硬件和操作系统的内存访问差异,使得Java程序在不同的平台上都能有一致的并发行为。happens - before规则是JMM中用于判断数据是否存在竞争、线程是否安全的重要规则。

2025-06-19 09:00:00 960

原创 【JAVA】51. 异步编程模型:反应式编程基础

反应式编程是一种面向数据流和变化传播的编程范式。它允许你以声明式的方式处理异步事件流,强调数据的异步处理和响应式的交互。在反应式编程中,数据被看作是一个流,这个流可以包含多个元素,并且可以在不同的时间点产生元素。程序可以对这个流进行各种操作,如过滤、映射、合并等,而不需要阻塞线程等待数据的到来。解答思路:背压机制是反应式编程中的一个重要概念,它允许订阅者控制从发布者接收数据的速率。当订阅者处理数据的速度较慢时,它可以通过对象的request方法请求较少的元素,从而避免数据过载。

2025-06-18 08:00:00 798

原创 【JAVA】50. 并发编程设计模式:Worker Thread与Thread - Per - Message

Worker Thread 模式也称为线程池模式,它预先创建一组线程(工作线程),这些线程不断地从任务队列中取出任务并执行。当有新任务到来时,将任务放入任务队列,工作线程会自动从队列中取出任务进行处理。这种模式可以避免频繁创建和销毁线程带来的开销,提高系统的性能和资源利用率。Thread - Per - Message 模式是指为每个请求创建一个新的线程来处理。当有新的请求到来时,立即创建一个新的线程来执行该请求的处理逻辑。这种模式的优点是实现简单,每个请求的处理是独立的,不会相互影响;

2025-06-17 09:15:00 1071

原创 【JAVA】49. 死锁检测与诊断:Jstack与可视化工具

摘要:本文详细解析了死锁的四大必要条件(互斥、请求和保持、不剥夺、循环等待),介绍了Jstack工具检测死锁的方法及输出分析,推荐了VisualVM等可视化诊断工具。针对实际业务场景(如数据库和分布式系统死锁)提供了解决方案,并给出面试常见问题解答思路。此外,提出了定期线程监控、优化锁使用等性能优化建议,推荐了官方文档、《Effective Java》等扩展学习资源,最后抛出3个思考题引导深入探讨死锁问题。(150字)

2025-06-16 09:31:41 741

原创 【JAVA】48. Semaphore信号量控制资源并发访问

Semaphore是 Java 并发包中的一个工具类,它用于控制对有限资源的并发访问。Semaphore内部维护了一组许可证(permit),线程在访问资源前需要先获取许可证,如果许可证数量为 0,则线程会被阻塞,直到有其他线程释放许可证。

2025-06-15 09:00:00 451

原创 【JAVA】47. 并发工具类CountDownLatch与CyclicBarrier

是 Java 并发包中的一个工具类,它允许一个或多个线程等待其他线程完成操作。内部维护了一个计数器,在创建对象时需要指定计数器的初始值。当一个线程完成操作后,会调用方法将计数器减 1,当计数器的值变为 0 时,等待的线程会被唤醒继续执行。也是 Java 并发包中的一个工具类,它允许一组线程相互等待,直到所有线程都到达一个屏障点,然后所有线程再继续执行。可以循环使用,当所有线程都到达屏障点后,屏障会被重置,可以继续使用。

2025-06-14 08:15:00 933

原创 【JAVA】46. AQS抽象队列同步器源码深度解析

AQS(AbstractQueuedSynchronizer)是 Java 并发包中的一个抽象类,它是构建锁和其他同步组件的基础框架。许多并发工具如Semaphore等都是基于 AQS 实现的。AQS 提供了一个 FIFO(先进先出)的队列来管理线程,通过一个int类型的状态变量state来表示同步状态,线程可以通过修改这个状态变量来获取或释放锁。} // 其他方法省略 }} // 其他方法省略 }} // 其他方法省略 }

2025-06-13 08:45:00 691

原创 【JAVA】45. 并发容器:CopyOnWriteArrayList与BlockingQueue

是 Java 并发包中的一个线程安全的列表实现。它采用了写时复制(Copy-On-Write)的策略,当对列表进行写操作(如addsetremove等)时,会先复制一份当前列表的副本,然后在副本上进行修改,最后将修改后的副本替换原来的列表。这种方式保证了在进行写操作时,不会影响其他线程的读操作,从而实现了读写分离。是一个接口,它继承自Queue接口,提供了阻塞操作的功能。当队列满时,插入操作会阻塞;当队列空时,移除操作会阻塞。常用于生产者 - 消费者模型中,协调生产者和消费者的速度。

2025-06-12 08:00:00 903

原创 【JAVA】44. ThreadLocal内存泄漏问题与解决方案

是 Java 中的一个线程局部变量工具类,它为每个使用该变量的线程都提供一个独立的变量副本,每个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。通常用于在多线程环境下,保存线程的上下文信息,如用户身份信息、事务 ID 等。

2025-06-11 08:00:00 800

原创 【JAVA】43. Fork/Join框架:分治算法与工作窃取

Fork/Join框架是Java 7引入的一个用于并行执行任务的框架,它基于分治算法的思想,将一个大任务拆分成多个小任务,然后并行执行这些小任务,最后将小任务的结果合并得到大任务的结果。Fork/Join框架的核心是和。

2025-06-10 08:45:00 1072

原创 【JAVA】42. CompletableFuture:异步编程组合操作

是 Java 8 引入的一个强大的异步编程工具,它实现了Future接口,同时还提供了丰富的方法用于组合和处理异步操作。与传统的Future相比,可以更方便地处理异步任务的结果,并且支持链式调用和异常处理。

2025-06-09 09:34:23 788

原创 【JAVA】41. Future与Callable:异步任务结果获取

任务时,要根据系统的硬件资源和任务的特点合理设置线程池的大小。方法会阻塞当前线程,直到任务完成并返回结果。如果任务执行时间过长,会导致当前线程长时间阻塞,影响系统的响应性能。另外,如果任务抛出异常,获取每个子任务的结果。例如,计算一个大数组中各个部分的和,最后将这些和相加得到最终结果。在一些需要进行大量计算的场景中,我们可以将计算任务拆分成多个子任务,每个子任务使用。接口是用于表示一个可以在单独线程中执行的任务,但它的。方法可以返回一个结果,并且可以抛出异常。通常用于不需要返回结果的任务,而。

2025-06-05 09:30:00 844

原创 【JAVA】40. Executors工具类与线程池最佳实践

Executors是 Java 中一个用于创建线程池的工具类,它提供了一系列静态方法来创建不同类型的线程池,简化了线程池的创建过程。这些方法返回的线程池实现类都是基于或。

2025-06-04 09:00:00 1162

原创 【JAVA】39. 线程池ThreadPoolExecutor核心参数解析

本文详细介绍了Java线程池的核心机制和应用。首先解释了线程池的基本概念和优势,重点剖析了ThreadPoolExecutor的构造参数(核心/最大线程数、空闲时间、任务队列等)及其工作原理。通过代码示例展示了线程池的创建、任务提交和关闭流程。文章还列举了Web服务器和批量数据处理等典型应用场景,解答了常见面试问题,并提供了性能优化建议(合理设置线程数、选择任务队列等)。最后推荐了扩展学习资源和提出思考题,帮助深入理解线程池的动态调整和预热机制。全文系统性地讲解了线程池从原理到实践的完整知识体系。

2025-06-03 09:04:23 613

原创 【JAVA】38. Condition条件队列实现生产者 - 消费者模型

在 Java 中,Condition接口是 Java 并发包中的一个重要接口,它为线程提供了一种更灵活的等待/通知机制,与Object类的wait()notify()和方法类似,但功能更强大。Condition实例是由Lock实例创建的,一个Lock可以创建多个Condition实例,每个Condition实例都有自己的等待队列。

2025-05-30 08:30:00 1677

原创 【JAVA】37. 读写锁ReentrantReadWriteLock应用场景

本文介绍了Java中的ReentrantReadWriteLock读写锁机制及其应用。核心内容包括:1)读写锁概念,允许多线程并发读但独占写;2)可重入性特性;3)代码示例展示了读写操作的基本用法。实际应用场景包括缓存系统和数据库连接池等读多写少的场景。文章还解答了常见面试问题,提出了减少锁持有时间、合理分配锁等优化建议,并推荐了扩展学习资源。最后提供了关于实现线程安全计数器、锁竞争优化和公平/非公平锁选择的思考题。

2025-05-30 08:15:00 884

原创 【JAVA】Lock接口与ReentrantLock源码分析(36)

摘要:Java的Lock接口提供了比synchronized更灵活的锁机制,支持可中断锁、超时锁和公平锁。ReentrantLock是其实现类,具有可重入性、可中断性和公平性,基于AQS实现。代码示例展示了如何使用ReentrantLock实现线程同步,常见场景包括资源竞争和任务调度。与synchronized相比,Lock提供更精细的控制,但需手动释放锁。

2025-05-29 08:30:00 1779

原创 【JAVA】原子类AtomicInteger与CAS原理(35)

摘要:本文介绍了Java原子类AtomicInteger及其CAS原理。AtomicInteger通过原子操作实现线程安全的整数运算,避免了同步锁的开销,适合计数器等场景(如网站访问统计)。CAS(比较并交换)是一种无锁并发机制,通过比较内存值与预期值实现原子更新,但存在ABA问题。文章通过代码示例展示了AtomicInteger在多线程任务调度和分布式锁中的应用,并对比了其与普通int的差异,同时提供了CAS的优化建议(如使用版本号解决ABA问题)。

2025-05-28 09:00:00 1530

原创 【JAVA】volatile关键字:可见性与禁止指令重排序(34)

摘要: volatile是Java中的轻量级同步机制,主要保证变量的可见性(确保线程修改后立即刷新到主内存)和禁止指令重排序。适用于状态标志(如线程控制开关)和单例模式的双重检查锁定。其原理通过内存屏障实现:写操作后强制刷盘,读操作前强制读主内存。典型业务场景包括配置热更新和缓存刷新。与synchronized相比,volatile不保证原子性但性能更优。使用时需注意:1)仅适合简单原子操作 2)避免滥用以减少性能开销 3)复杂场景可结合锁机制。面试常考察其与synchronized的区别及双重检查锁定的实

2025-05-27 09:40:49 1040

原创 【JAVA】synchronized关键字:锁升级与偏向锁机制(33)

synchronized 是 Java 中用于实现线程同步的关键字,确保同一时刻只有一个线程访问被修饰的代码块或方法,避免数据不一致问题。它可用于修饰实例方法、静态方法和代码块,分别锁定当前实例对象、类的 Class 对象或指定对象。Java 6 引入了锁升级机制,锁状态从无锁、偏向锁、轻量级锁到重量级锁逐步升级,以优化不同并发场景下的性能。偏向锁通过记录线程 ID 提高单线程性能,轻量级锁使用 CAS 操作减少线程阻塞,重量级锁则通过操作系统互斥量实现。实际应用中,synchronized 可用于多线程计

2025-05-26 09:30:00 1627

原创 【JAVA】线程创建方式:继承Thread vs 实现Runnable(32)

Java中创建线程的两种主要方式是通过继承Thread类或实现Runnable接口。继承Thread类的方式简单直观,但受限于Java的单继承机制,且线程与任务耦合度高,不利于代码复用。实现Runnable接口的方式则避免了单继承的限制,线程与任务分离,提高了代码的复用性,但代码相对复杂。根据具体需求,简单任务且无需继承其他类时,可选择继承Thread类;需要复用任务或继承其他类时,建议使用Runnable接口。实际应用中,多线程文件处理和多线程游戏开发是常见的场景,分别展示了Runnable接口和Thre

2025-05-25 10:00:00 753

原创 【JAVA】多线程基础:线程生命周期与状态切换(31)

Java多线程是程序执行的最小单元,允许同时执行多个任务,提升效率和资源利用率。其生命周期包括新建、就绪、运行、阻塞、等待、超时等待和终止状态,状态间通过不同方法切换。多线程适用于提高性能(如并行处理数据)和异步操作(如文件下载、网络请求)。实际应用中,多线程可用于文件下载(将文件分块并行下载)和网络爬虫(多线程爬取网页)。通过合理使用多线程,可以显著提升程序的执行效率和用户体验。

2025-05-24 09:45:00 1729

原创 【JAVA】注解基础:元注解与自定义注解(30)

Retention:指定注解的保留策略,即注解在什么阶段可用。它有三个取值::注解只在源码中保留,编译时会被丢弃。:注解在编译时保留在字节码中,但在运行时不会被加载。:注解在运行时也会被保留,可以通过反射机制读取。@Target:指定注解可以应用的程序元素类型,例如类、方法、字段等。可以使用枚举来指定,如表示可以应用于类、接口等,表示可以应用于方法。:指定注解是否会被包含在 JavaDoc 文档中。@Inherited:指定注解是否可以被继承。如果一个类使用了带有@Inherited。

2025-05-23 09:30:00 703

原创 【JAVA】泛型高级用法:通配符与PECS原则(29)

解答思路:PECS 原则即“Producer Extends, Consumer Super”,当一个泛型类型主要用于生产数据(读取数据)时,使用?extends T通配符;当一个泛型类型主要用于消费数据(写入数据)时,使用?super T通配符。

2025-05-22 09:30:00 741

原创 【JAVA】比较器Comparator与自然排序(28)

Comparator是 Java 中的一个函数式接口,位于java.util包下。它用于定义对象之间的比较规则,允许我们根据自定义的逻辑对对象进行排序。与对象的自然排序(实现Comparable接口)不同,Comparator可以在不修改对象类的情况下,灵活地定义多种不同的排序方式。

2025-05-21 09:16:09 1320

原创 【JAVA】Iterator与Fail - Fast机制源码解读(27)

Iterator解答思路:Fail - Fast 机制是 Java 集合框架中的一种错误检测机制,当一个集合在被某个Iterator遍历的同时被其他线程或本线程的其他操作修改时,Iterator会立即抛出。它通过一个modCount变量来实现,modCount记录了集合结构被修改的次数,Iterator在遍历过程中会检查modCount是否发生变化。

2025-05-20 09:00:00 768

原创 【JAVA】ConcurrentHashMap线程安全实现原理(26)

缺点是在某些情况下,锁的粒度可能不够细,仍然会存在锁竞争的问题,并且分段锁的实现相对复杂,增加了代码的复杂度。当进行写操作时,首先会通过 CAS 操作尝试更新节点,如果 CAS 操作失败,则使用。使用分段锁机制,将整个哈希表分成多个段,每个段有自己的锁,不同线程可以同时访问不同的段。:在 Java 7 中,通过分段锁机制,每个段有自己的锁,线程在访问某个段时需要获取该段的锁。锁,使用数组存储节点,当进行写操作时,先尝试 CAS 操作,失败后使用。当进行写操作时,线程需要先获取对应段的锁,然后再进行操作。

2025-05-19 09:15:00 952

原创 【JAVA】HashMap深度剖析:哈希冲突与扩容机制(25)

HashMap。

2025-05-18 08:00:00 643

原创 【JAVA】ArrayList与LinkedList源码级性能对比(24)

但如果需要先定位到插入位置,由于需要遍历链表,时间复杂度为 O(n)。但如果需要先定位到删除位置,由于需要遍历链表,时间复杂度为 O(n)。时,如果已知元素的大致数量,可以通过构造函数指定初始容量,避免频繁的扩容操作,提高性能。在需要展示大量数据,并且用户可能会频繁根据索引查看数据的场景中,如表格数据展示,可以使用。的随机访问时间复杂度为 O(1),性能较高。在消息队列系统中,需要频繁在队列的头部和尾部进行插入和删除操作,此时可以使用。方法实现扩容,会创建一个新的数组,并将原数组的元素复制到新数组中。

2025-05-17 11:30:00 1602

原创 【JAVA】集合框架概述:List/Set/Map核心区别(23)

接口定义了集合的基本操作和行为,实现类是对接口的具体实现,算法则提供了对集合进行操作的方法。保证键按照自然顺序或指定的比较器顺序排列,基于红黑树实现,查找、插入和删除操作的时间复杂度为 O(log n)。是一个键值对的集合,它存储的是键和值之间的映射关系。是一个有序的集合,它允许存储重复的元素。不保证键的顺序,基于哈希表实现,查找和插入操作的时间复杂度为 O(1)。是一个不允许存储重复元素的集合,它不保证元素的顺序。存储键值对,键唯一,通过键访问值,适用于根据键快速查找值的场景。如果需要频繁随机访问元素,

2025-05-16 09:15:00 1257

原创 【JAVA】泛型基础:类型擦除与桥接方法揭秘(22)

解答思路:类型擦除是 Java 泛型的实现方式,在编译时,编译器会将泛型类型参数擦除,替换为它们的边界类型(如果没有指定边界,则替换为Object其影响包括无法在运行时获取泛型类型信息,泛型数组的创建受限等。

2025-05-15 09:41:27 722

原创 【JAVA】自定义异常与异常链传递实战(21)

在 Java 中,自定义异常类通常是通过继承Exception类(用于创建受检查异常)或类(用于创建非受检查异常)来实现的。// 自定义受检查异常类// 无参构造方法super();// 带消息的构造方法// 带消息和原因的构造方法上述代码中,类继承自Exception类,并且提供了三种常见的构造方法,方便在不同场景下抛出异常时携带不同的信息。如果要创建非受检查异常,只需继承// 自定义非受检查异常类super();// 自定义业务异常类// 模拟数据库操作类。

2025-05-15 09:35:57 1336

原创 【JAVA】异常处理机制:try - catch - finally底层原理(20)

在 Java 中,异常是指程序在运行过程中出现的不正常情况。异常处理机制允许程序在出现异常时进行捕获和处理,从而避免程序崩溃。Java 中的异常分为两类:受检查异常(Checked Exception)和非受检查异常(Unchecked Exception)。受检查异常必须在方法签名中声明或者进行捕获处理,而非受检查异常则不需要。解答思路:可以通过继承Exception类(受检查异常)或类(非受检查异常)来自定义异常类。然后在需要抛出异常的地方使用throw关键字抛出该异常对象。

2025-05-14 09:30:00 1174 2

原创 【JAVA】枚举类:单例模式与线程安全实践(19)

Java枚举类是一种特殊的类,用于表示一组固定的常量,具有类型安全和可迭代的特点。它常用于表示固定值集合或状态机。枚举类在实现单例模式时具有显著优势,因其天生线程安全且能防止反序列化和反射攻击,确保单例的唯一性。实际业务中,枚举类可用于配置管理和权限管理等场景。面试中常见问题包括枚举类实现单例模式的优势、实例创建时机及如何添加方法和属性。性能优化建议包括合理使用枚举类、避免复杂初始化操作及注意序列化问题。扩展学习资源推荐官方文档和相关书籍。思考题涉及枚举类实现接口、抽象方法及性能优化。

2025-05-13 09:15:00 659

原创 【JAVA】内部类与匿名类:Lambda表达式前传(18)

内部类是定义在另一个类内部的类。它可以访问外部类的成员,包括私有成员。成员内部类:定义在外部类的成员位置,与成员变量和成员方法平级。示例代码如下:静态内部类:使用static关键字修饰的内部类。静态内部类只能访问外部类的静态成员。示例代码如下:局部内部类:定义在方法内部的类。局部内部类只能在定义它的方法内部使用。

2025-05-12 10:17:40 692

原创 【JAVA】final关键字:类、方法、变量的终极约束(17)

在实际业务中,经常需要定义一些常量,如数学常数、配置参数等。使用final关键字可以确保这些常量的值不会被意外修改。

2025-05-11 09:00:00 931

原创 【JAVA】抽象类与接口:设计模式中的应用对比(16)

抽象类是使用abstract关键字修饰的类。它不能被实例化,主要用于作为其他类的基类,提供一些通用的属性和方法。抽象类可以包含抽象方法和具体方法。抽象方法是使用abstract关键字修饰的方法,它只有方法声明,没有方法体,子类必须实现这些抽象方法。在这个例子中,Shape是一个抽象类,包含一个具体方法getColor和一个抽象方法area。

2025-05-10 11:45:00 1096

java springboot MultipartFile 根据注解自动识别表头对应对象字段名称,方法返回List-Map 对象

语言:java 框架:SpringBoot, apache.poi 文件对象: MultipartFile 根据注解(ExcelNameAnno)自动识别表头对应对象字段名称,方法返回Map<String, String>对象 -- 有问题请联系:[email protected] 或私信 -- 主要实现: 通过动态传入对象class,解析class对象中包含ExcelNameAnno注解方式, 表头返回对应的对象,从第2行开始,解析每列的数据,根据表头定义list map对象key值; 方法返回: [ { "fieldName1": "fieldValue1", "fieldName2": "fieldValue2", "fieldName3": "fieldValue3", "fieldName4": "fieldValue4" } ]

2024-08-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除