自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 【Spring Boot 3】的安全防线:整合 【Spring Security 6】

探索如何将Spring Boot 3与Spring Security 6完美融合,为您的应用程序打造坚实的安全防线。本文深入剖析整合过程,从基础概念到高级特性,为您呈现全面的安全解决方案。无论您是初学者还是经验丰富的开发者,都能在本文中获得宝贵的见解。学习如何配置用户认证、授权和密码加密,掌握基于注解的安全性高级功能。通过清晰的示例和实用的指导,本文将帮助您提升应用程序的安全性,保护您的数据免受威胁。立即开始,构建一个安全可靠的Spring Boot应用!

2024-03-02 19:48:05 3133 8

原创 探索【注解】、【反射】、【动态代理】,深入掌握高级 Java 开发技术

本文将带领读者深入了解 Spring 框架中的关键技术:注解、反射和动态代理。注解作为一种元数据,大幅简化了 Spring 应用程序的配置和管理。反射机制赋予了程序在运行时动态获取和操作类信息的能力,为 Spring 提供了高度灵活性。而动态代理则是 Spring AOP 的基础,通过代理模式实现了横切关注点的管理。本文旨在帮助读者深入理解这些关键概念,提升其对 Spring 框架的掌握程度,从而更加熟练地运用 Java 开发技术。

2024-02-17 21:14:48 1508 4

原创 18.并发编程原子性、可见性、有序性原理

在并发编程的领域里,原子性、有序性和可见性是构建高效、正确并发系统不可或缺的三大基石。本文深入浅出地探讨了这三个核心概念,揭示它们如何共同支撑起多线程环境下程序的可靠执行。

2024-05-22 06:47:20 552

原创 HandlerMethodArgumentResolver用法

HandlerMethodArgumentResolver 是Spring MVC框架中的一个核心接口,它扮演着数据绑定和类型转换的重要角色,负责处理控制器方法参数的解析与注入。这一机制极大地增强了Spring框架处理HTTP请求的灵活性和便捷性,允许开发者自定义参数解析逻辑,以支持复杂类型、自定义注解或从请求中提取特定信息。

2024-05-18 08:29:32 1229

原创 17.高并发场景下CAS效率的优化

LongAdder的基本思路就是分散热点,将value值分散到一个数组中,不同线程会命中不同槽中的元素,每个线程只能对自己槽中的那个值进行CAS操作,这样热点就被分散了,冲突的概率就小很多了。LongAdder的实现思路其实和CurrentHashMap中分段使用的原理非常相似,本质上都是不同的线程,在不同的单元上进行操作,减少了线程的竞争,提高了并发的效率。总的来说,LongAdder 的设计思路清晰,将累加操作分解成多个独立的单元,通过分段累加和并行计算提高了在高并发情况下的性能表现。

2024-05-16 07:19:47 936

原创 16.ABA问题

ABA问题是指在并发编程中,由于CAS(比较并交换)操作的特性,可能出现的一种问题。CAS是一种乐观锁机制,用于实现多线程环境下的原子操作。期望值更新值和当前值。CAS操作会比较当前值和期望值,如果相等,则将当前值更新为新值,否则不进行任何操作。CAS操作的局限性导致了ABA问题的出现。并发场景下的共享变量修改:多个线程同时对一个共享变量进行修改和操作。CAS操作的原子性:CAS操作只能检查共享变量当前的值是否和预期值相等,并在相等时才进行更新操作。

2024-05-15 12:43:40 708 1

原创 15.JUC原子类

基础原子类(以AtomicInteger为例),主要是通过CAS自旋 + volatile相结合的方案实现,既保证了变量操作线程的原子性,有避免了synchronized重量级锁的开销,使得Java程序的效率得到大幅度提升。基础原子类型 只能保证一个变量的原子操作,但是当需要对多个变量操作时,CAS无法保证原子性操作,这个时候可以使用AtomicReference(原子引用类型),保证对象引用的原子性。属性更新原子类是Java并发包提供的一组类,用于原子性地更新对象中的属性值。

2024-05-14 08:02:55 932

原创 14.CAS原理

JDK 5 所增加的 JUC(java.util.concurrent)并发包对操作系统的底层的CAS原子操作进行了封装,为上层Java程序提供了CAS操作的APICAS(Compare and Swap)是一种并发编程中的原子操作,用于实现多线程环境下的无锁同步。内存位置(或者说是要操作的变量的引用)、期望值和新值。首先,读取内存位置的当前值,这是期望值。然后,将期望值与内存位置的当前值进行比较。如果相等,则说明内存位置的值没有被其他线程修改,可以进行更新操作。

2024-05-13 06:50:36 963

原创 13.重量级锁原理及其实战

这篇文章深入探讨了重量级锁的核心原理及其在JVM中的实现细节。重量级锁通过监视器来保护临界区代码,确保在任何时刻只有一个线程可以进入临界区执行。文章详细解释了监视器的特点,如同步、协作、信号机制等,并介绍了在JVM中监视器是如何通过ObjectMonitor类来实现的,以及该类的关键属性和作用。其中,_cxq、_WaitSet、_EntryList等队列被用来存放等待获取监视器锁的线程,而_owner变量则记录了当前持有该监视器的线程。通过分析这些细节,读者可以更深入地理解重量级锁的工作原理和实现机制。

2024-05-10 07:07:45 741

原创 12.轻量级锁原理及其实战

引入轻量级锁的主要目的是在多线程环境竞争不激烈的情况下, 通过CAS机制竞争锁减少重量级锁的产生的性能损耗,重量级锁使用了操作系统底层的互斥锁,会导致线程在用户态和核心态之间频繁切换,从而带来较大的性能损耗。因为内置锁对象的Mark Word的结构会有所变化,Mark Word将会出现一个指向锁记录的指针,而不再存在无锁状态下的锁的哈希码等信息,所以必须将这些信息暂存起来,供后面锁释放的时候使用。轻量级锁膨胀是指在使用轻量级锁的过程中,如果锁竞争激烈或者存在其他特定情况,JVM会将轻量级锁膨胀为重量级锁。

2024-05-09 07:20:19 833

原创 11.偏向锁原理及其实战

偏向锁是Java虚拟机(JVM)为了优化无竞争情况下的锁性能而引入的机制。当一个线程获取了对象的锁时,JVM会将该对象标记为偏向锁状态,并记录获取锁的线程ID。在无竞争情况下,线程再次获取锁时无需竞争,直接进入同步代码块,提高程序性能。然而,偏向锁引入了记录线程ID和CAS操作的开销,因此JVM会延迟启用偏向锁。偏向锁并不适用于有竞争的情况,会自动升级为轻量级锁或重量级锁以保证线程的互斥访问和数据一致性。

2024-05-08 11:51:56 619

原创 10.Java对象内置结构

这篇文章详细介绍了Java对象的内置结构,分为对象头、对象体和对齐字节三个部分。对象头包括标记字、类指针和数组长度等字段,用于存储对象的元数据和状态信息。对象体则包含实例变量,用于存储对象的属性值。对齐字节则是为了优化内存访问效率而添加的额外字节,确保对象在内存中对齐。文章还介绍了对象结构中核心字段的作用,包括标记字、类指针、数组长度等。最后,通过图示和解释说明了Mark Word的结构信息,以及使用JOL工具查看对象布局的方法。这篇文章总结了Java对象内置结构的关键概念和机制,适合Java开发者深入了解

2024-05-07 07:27:06 857

原创 9.Java内置锁的核心原理-Synchronized

本文深入探讨了Java内置锁(Synchronized)的核心原理。首先介绍了内置锁的基本概念,包括互斥性、可重入性、等待与通知机制以及内存可见性。然后详细解释了对象监视器、互斥性、可重入性、等待与通知机制以及内存可见性等方面的实现原理。最后,阐述了使用synchronized关键字修饰代码块或方法时的行为,以及线程在获取锁后执行被保护代码的流程。通过这些内容,读者能够深入理解Java内置锁的工作机制,从而更好地编写线程安全的Java代码。

2024-05-06 07:17:25 887 2

原创 8.Java并发编程—ThreadLocal,TreadLocalMap,InheritableThreadLocal,TransmittableThreadLocal使用指南

本文带深入探讨 ThreadLocal、ThreadLocalMap、InheritableThreadLocal 和 TransmittableThreadLocal 的详细使用。介绍了 ThreadLocal 的作用和原理,并提供了基本使用方法。随后,对 ThreadLocalMap 进行了深度解析,包括内部结构、工作原理和增删改查操作。接着,讨论了 InheritableThreadLocal 在线程继承中的应用和特性,以及 TransmittableThreadLocal 在线程池和异步调用。

2024-03-27 23:04:11 936 2

原创 7.Java并发编程—掌握线程池的标准创建方式和优雅关闭技巧,提升任务调度效率

本文详细介绍了线程池的标准创建方式和参数设置,包括核心线程数、最大线程数和阻塞队列的选择。同时,探讨了向线程池提交任务的两种方式:execute()和submit()。通过案例演示,展示了如何使用这两种方法来提交任务。此外,文章还介绍了线程池的任务调度流程,包括ThreadFactory的源码解析和自定义简单线程工厂的实现方式。对于任务阻塞队列和线程池的拒绝策略也进行了解析,并提供了优雅关闭线程池的方法。最后,通过测试案例验证了限时等待和等待全部任务执行完毕两种关闭线程池的技巧,帮助读者更好地掌握线程池。

2024-03-24 20:21:33 948 1

原创 6.Java并发编程—深入剖析Java Executors:探索创建线程的5种神奇方式

本文深入剖析了Java中使用Executors类创建线程的5种方式。这些方式包括newSingleThreadExecutor()、newFixedThreadPool(int nThreads)、newCachedThreadPool()、newScheduledThreadPool(int corePoolSize)和newWorkStealingPool(int parallelism)。每种方式都具有独特的特点和适用场景。通过了解这些线程池的工作原理和适用性,我们可以根据实际需求选择最合适的线程池类

2024-03-13 21:58:37 368 2

原创 5.Java并发编程—JUC线程池架构

Java并发编程中的JUC(Java Util Concurrent)线程池架构是一种强大的工具,用于管理和调度多个线程执行任务。该架构提供了一种高效、可扩展的方式来处理并发任务。JUC线程池架构的核心组件包括线程池Executor、工作线程Worker和任务队列BlockingQueue。Executor是线程池的主要入口,它接收任务并将其提交给线程池进行执行。Worker线程负责执行任务的实际逻辑,通过从任务队列中获取任务并执行。任务队列是一个缓冲区,用于存储待执行的任务。

2024-03-12 22:19:31 1254

原创 Java线程的基本操作

线程基本操作包括sleep、interrupted、join、yield等。sleep用于使线程暂停一段时间,通常用于模拟等待或者定时任务。interrupted用于检查线程是否被中断,可以帮助线程处理中断请求。join用于等待线程执行完成,主要用于协调多个线程的执行顺序。yield让出当前线程的执行权,让其他线程有机会执行,有助于提高线程执行的公平性。这些操作都是多线程编程中常用的基本操作,能够帮助程序员控制线程的执行顺序和行为,确保线程之间的协作和同步。

2024-03-12 00:14:30 1117

原创 深入理解Java线程执行原理

在学习线程的核心原理之前,我们先来了解一下 线程的调度 和执行在Java中,线程调度与执行是指Java虚拟机(JVM)根据一定的调度算法和优先级来决定哪个线程在特定时刻执行。线程调度是多线程并发执行的关键部分,它决定了线程在CPU上执行的顺序和时间片分配。

2024-03-09 10:21:55 1040

原创 Java并发编程-实现多线程的四种方式

在Java中,有四种常见的创建线程的方式:继承Thread类、实现Runnable接口、实现Callable接口配合Future和ExecutorService、以及使用Executor框架。每种方式都有自己的优缺点和适用场景。继承Thread类简单直接,但限制了类的继承层次结构;实现Runnable接口避免了单继承的限制,提高了灵活性;实现Callable接口可以获取任务执行结果和控制线程数量,但相对繁琐;使用Executor框架提供了高度灵活的线程管理和任务调度功能,但需要合理配置以避免资源浪费。选择合

2024-03-07 22:04:59 1116

原创 从零开始学习Netty - 学习笔记 -Netty入门【自定义编码器解码器】

在Netty中,自定义编码器和解码器是网络应用程序中关键的组件之一。通过自定义编码器和解码器,可以实现将对象转换为字节流(编码)和将字节流转换为对象(解码)的过程。这样的功能对于网络通信中的数据序列化和反序列化至关重要。Netty提供了丰富的API和抽象类来简化自定义编码器和解码器的开发过程。编码器负责将应用程序的数据转换为网络传输的数据,而解码器则负责从网络传输的数据中提取出应用程序的数据。通过合理设计和实现自定义编码器和解码器,可以提高网络应用程序的性能和可靠性。

2024-03-05 23:38:00 666

原创 Java并发编程-进程和线程

进程和线程是计算机科学中重要的概念,用于管理程序的执行和资源分配。进程是操作系统中的一个独立执行单位,拥有自己的内存空间和系统资源。每个进程都可以包含一个或多个线程,线程是进程内的实际执行单元,共享相同的内存空间和资源。本文简要介绍了进程和线程的概念、特点以及它们在计算机系统中的作用。进程和线程的使用使得程序能够并发执行,提高了系统的效率和性能。然而,进程和线程的管理也面临着诸多挑战,如资源竞争、死锁等问题。因此,合理地使用和管理进程与线程对于保障系统稳定运行和提升性能至关重要。

2024-03-05 21:32:03 691

原创 LeetCode刷题-206.反转链表【递归实现】

LeetCode刷题,第206题,反转链表。给你单链表的头节点head,请你反转链表,并返回反转后的链表。

2024-03-04 22:41:20 271

原创 从零开始学习Netty - 学习笔记 -Netty入门【协议设计和解析】

在计算机中,协议是指一组规则和约定,用于在不同的计算机系统之间进行通信和数据交换。计算机协议定义了数据传输的格式、顺序、错误检测和纠正方法,以及参与通信的各个实体的角色和责任。计算机协议可以在各种不同的层次上操作,包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

2024-03-04 22:19:23 1072

原创 设计模式—命令模式:探索【命令模式】的奥秘与应用实践!

命令模式是一种行为设计模式,旨在将请求封装成独立的对象,使得发送者和接收者之间解耦。该模式由命令、接收者、调用者和客户端组成。命令对象封装了请求的细节,接收者执行实际操作,调用者将命令发送给接收者。命令模式有助于实现撤销、重做、日志记录等功能,并支持将多个命令组合成复杂命令。然而,命令模式可能导致类爆炸和命令逻辑混乱。在Java中,命令模式常用于撤销/重做功能、任务队列和菜单操作等场景。优秀的命令模式实现应注重接口设计、合理使用抽象类、选择适当的命令实现方式,并考虑多线程环境下的线程安全性。

2024-03-03 19:36:30 791

原创 从零开始学习Netty - 学习笔记 -Netty入门【半包,黏包】

Netty是一款高性能的网络通信框架,但面临黏包与半包等问题。黏包指发送方多个消息合并成一个,半包是指接收方无法完整读取一个消息。Netty通过粘包拆包机制解决这些问题。解决黏包可通过消息长度前缀、特殊符号分隔消息、固定长度消息等方式。解决半包可采用消息长度字段、消息边界、消息头包含消息体长度等方式。Netty提供编解码器、DelimiterBasedFrameDecoder、LengthFieldBasedFrameDecoder等工具帮助处理这些问题,确保数据准确传输。

2024-03-03 19:26:02 794

原创 Linux搭建SFTP服务器

最简单,最实用的Linux搭建SFTP教程。SFTP(SSH文件传输协议)是一种安全的文件传输协议,用于在计算机之间传输文件。它基于SSH(安全外壳协议)的子系统,提供了加密的、可靠的数据传输通道,用于在客户端和服务器之间安全地传输文件。

2024-03-02 19:34:14 1918

原创 SpringBoot 整合WebService

SOAP Web服务:基于SOAP(Simple Object Access Protocol)协议的Web服务。SOAP是一种用于交换结构化信息的协议,它使用XML作为消息格式,并通常通过HTTP协议进行传输。RESTful Web服务:基于REST(Representational State Transfer)原则的Web服务。RESTful服务使用标准的HTTP方法(如GET、POST、PUT、DELETE)来执行操作,并通常返回JSON或XML格式的数据。

2024-03-01 22:28:45 928 3

原创 Spring Boot整合Kafka

Kafka作为一款分布式流处理平台,具有高吞吐量、持久性、容错性等特点,适用于构建大规模的实时数据管道。Spring Boot作为快速开发框架,提供了简化开发和部署的能力,使得与Kafka的整合变得更加容易。通过将Spring Boot与Kafka进行整合,具有以下优势异步消息处理:Kafka可以作为消息队列,实现异步消息的生产和消费,提高系统的吞吐量和响应速度。解耦和扩展性:消息队列的引入可以解耦不同系统或模块之间的依赖关系,提高系统的灵活性和可维护性。数据流处理。

2024-03-01 22:04:20 1094

原创 模板方法模式

模板方法模式属于23种设计模式中的行为型模式。在抽象类中公开定义了执行的方法,子类可以按需重写其方法,但是要以抽象类中定义的方式调用方法。总结起来就是:定义一个操作的算法结构,而将一些步骤延迟到子类中。在不改变算法结构的情况下,子类能重定义该算法的特定步骤。

2024-02-29 21:41:55 768 1

原创 从零开始学习Netty - 学习笔记 -Netty入门【ByteBuf】

ByteBuf是Netty框架中的核心组件,用于高效处理网络数据。其灵活的API和多种实现方式使数据操作变得简单直观,满足各种需求。ByteBuf具有优秀的内存管理机制和性能优化设计,能在高并发、大数据量情况下保持卓越性能。此外,ByteBuf提供了编解码支持、数据合并等附加功能,为网络数据处理提供便利。无论您是网络通信开发者还是对网络通信感兴趣的人,了解和掌握ByteBuf都是提升技能的关键。点击了解ByteBuf,探索其强大功能和无限可能性。

2024-02-29 21:19:33 993

原创 深入探究【观察者模式】:简单音乐会售票系统案例分析

本篇文章深入探讨了观察者模式的基本概念、工作原理以及在音乐会售票系统中的应用。首先介绍了观察者模式的定义和工作原理,然后通过音乐会售票系统的案例展示了观察者模式的具体实现和优点。文章还分析了观察者模式的优点与局限性,并提出了在实际项目中应用观察者模式的建议。最后,通过更深层次的思考和案例分析,展示了观察者模式在事件驱动架构、异步通信、领域驱动设计和消息传递中的重要作用。观察者模式作为一种强大的设计模式,能够有效地实现对象之间的解耦合和协同工作,在实际项目中具有广泛的应用前景。

2024-02-28 22:26:28 1125 1

原创 从零开始学习Netty - 学习笔记 -Netty入门【Future & Promise】【Handler & Pipeline】

文章介绍了在异步处理中常用的Future & Promise模式以及Handler & Pipeline架构。它们是开发者处理异步操作和事件的重要工具。Future代表异步操作的未来结果,而Promise则对该结果做出承诺。Handler & Pipeline用于处理事件和数据流,通过处理器和管道组织处理逻辑,提高系统的并发性和可维护性。文章通过对比JDK和Netty中的Future以及Promise的特性和用法,以及Handler & Pipeline的实际应用,展示了它们在软件开发中的重要性和灵活性。

2024-02-28 22:00:10 958 1

原创 深入理解Java并发编程中的LockSupport

Java并发编程中的LockSupport类是一个重要的工具,用于线程的阻塞和唤醒操作。相比传统的同步机制,LockSupport提供了更灵活、安全的线程同步方式。其基本概念包括park()和unpark()方法,通过操作系统提供的底层同步机制实现线程的阻塞和唤醒。LockSupport与synchronized、wait/notify相比具有更精细的线程控制能力,支持线程中断,避免了死锁问题。在实际应用中,LockSupport常用于自定义同步器和高性能并发场景,需要注意避免多次调用unpark()方法

2024-02-27 23:38:38 670

原创 从零开始学习Netty - 学习笔记 -Netty入门-ChannelFuture

Netty中的Channel是网络传输的核心组件,用于表示开放连接。它提供了统一的视图,支持TCP和UDP等不同类型的网络传输。Channel具有生命周期,包括创建、连接、读取、写入和关闭等阶段。通过Channel,可以实现异步的I/O操作,并通过ChannelHandler和ChannelPipeline处理入站和出站事件。Channel的灵活性和可扩展性使其成为构建高性能网络应用程序的理想选择。

2024-02-27 23:08:59 985

原创 基于ReentrantLock的Java并发编程探索

并发编程是指在计算机系统中,同时执行多个独立的任务或操作的一种编程方式。在现代计算机系统中,利用多核处理器、分布式系统等技术,实现并发性已经成为常态。提高系统性能:通过并发编程,可以充分利用计算资源,同时执行多个任务,提高系统的吞吐量和响应速度。例如,可以将一个大型任务拆分成多个子任务并行执行,加快整体处理速度。提升用户体验:对于需要实时响应的应用程序,如网络服务器、图形界面程序等,采用并发编程可以避免因单线程阻塞而导致的界面卡顿或响应延迟,提升用户体验。资源利用率提高。

2024-02-25 16:37:02 1092

原创 从零开始学习Netty - 学习笔记 -Netty入门-EventLoop

Netty的EventLoop是其核心组件之一,负责处理网络事件、执行I/O操作以及调度任务。本文将探讨Netty EventLoop的关键特性和工作原理。首先,EventLoop采用了单线程模型,通过轮询方式处理事件,确保了线程安全性。它充分利用了Selector技术,实现了高效的事件驱动机制,可以同时处理大量连接。其次,EventLoop采用了任务队列和定时器来管理各种任务,包括用户自定义的业务逻辑和定时任务。这种灵活的任务调度机制使得Netty在处理复杂网络应用时表现出色。此外,Event

2024-02-25 07:00:00 656 1

原创 SpringBoot -【SmartInitializingSingleton】基础使用及应用场景

`SmartInitializingSingleton` 接口。在 `Spring Framework` 中,`SmartInitializingSingleton` 是一个特殊的接口,用于在 Spring 容器中所有单例 Bean 初始化完成后执行一些自定义的初始化逻辑。它允许开发者在所有单例 Bean 都已经准备就绪后执行一些特定的操作,这对于需要在应用程序启动时进行一些额外的初始化工作的场景非常有用。

2024-02-24 13:53:03 1016 1

原创 SpringBoot -【BeanFactory】基础使用及应用场景

Spring框架中的BeanFactoryAware接口允许Bean获取对Spring IoC容器的引用,以便在需要时与容器进行交互。通过实现该接口,Bean可以动态获取其他Bean实例、访问容器的配置信息,并控制Bean的生命周期。通过示例展示了如何利用BeanFactoryAware接口实现动态加载Bean的功能,以及在特定场景下的应用。优点包括灵活性高、容器完全管理和解耦合,但也需要注意复杂性增加、容错性差和性能影响等缺点。在对灵活性和定制化需求较高的情况下,可以考虑使用该接口。

2024-02-24 12:06:07 1358

原创 SpringBoot -【BeanPostProcessor】基础使用及应用场景

BeanPostProcessor是Spring框架中一个重要的接口,允许开发人员在Bean对象初始化的不同阶段插入自定义逻辑。它提供了灵活性和可扩展性,可用于简化依赖注入、实现面向切面编程、优化配置管理等方面。然而,使用BeanPostProcessor需要注意避免循环依赖、谨慎处理Bean初始化逻辑、注意性能影响等常见问题。通过正确使用注意事项,可以更安全、高效地利用BeanPostProcessor来增强Spring应用程序的功能。

2024-02-24 12:03:48 1332

空空如也

空空如也

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

TA关注的人

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