自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM-内存结构

JVM内存结构核心分为五大区域:程序计数器(线程私有,记录指令位置)、虚拟机栈(方法调用栈帧结构,含局部变量表和操作数栈)、本地方法栈(服务JNI方法)、堆(对象存储区域,分年轻代和老年代)和方法区(类元数据存储,JDK8后改为元空间)。常量池体系分为三级:Class文件常量池(编译期静态存储)、运行时常量池(类加载后解析符号引用)和字符串常量池(JDK7后位于堆中,支持GC回收)。其中字符串常量池通过intern机制实现字符串复用,优化内存使用。不同区域各有特性,如程序计数器唯一不会OOM,而堆和方法区存

2025-06-04 17:00:58 1133

原创 Java并发编程中的锁分类

本文系统梳理了Java中锁的分类与特性。按设计思想分为乐观锁(CAS机制)和悲观锁(同步阻塞);按功能特性涵盖可重入性、公平性、共享性等维度,如可重入锁避免递归死锁、读写锁优化读多写少场景;按实现机制区分内置锁(synchronized)与显式锁(ReentrantLock)。同时详解了锁优化(偏向/轻量级/重量级锁)和应用策略(分段锁、条件锁)。最后强调应根据并发强度、临界区复杂度等场景因素选择锁类型,并注意死锁与性能平衡。全文为高并发编程提供了清晰的锁选型指南。

2025-05-27 17:06:24 362

原创 Lock锁

可以显著提升多线程程序的灵活性和性能。

2025-05-23 15:01:14 917

原创 异步回调CompletableFuture

CompletableFuture 是 Java 中处理异步编程的核心工具,其核心思想是通过非阻塞的方式执行任务,任务完成后通过回调通知主线程,避免线程闲置等待。它支持链式调用(如 thenApply、thenAccept)来定义任务完成后的后续操作,显著简化了异步任务的管理。CompletableFuture 提供了丰富的创建、处理和组合异步任务的方法,如 runAsync、supplyAsync、allOf 和 anyOf,并支持异常处理(如 whenComplete、exceptionally)。其优

2025-05-23 14:35:55 551

原创 ForkJoin

Fork/Join 框架是 Java 中用于高效并行计算的核心工具,其设计基于分治策略和工作窃取算法。通过将复杂任务递归拆分为子任务,直到任务足够简单可直接计算,框架能够最大化 CPU 利用率。核心组件包括 ForkJoinPool 线程池和 ForkJoinTask 任务抽象基类,支持有返回值和无返回值的任务。任务执行流程包括任务拆分、结果合并和工作窃取动态平衡。代码实现示例展示了如何使用 Fork/Join 计算大数组的和。性能优化指南建议合理设置任务阈值、避免阻塞操作、确保任务拆分平衡性,并处理异常。

2025-05-23 14:32:09 847

原创 线程池详解

线程池通过池化技术复用线程,减少创建和销毁的开销,提高资源利用率,避免因线程过多导致系统崩溃。其优势包括降低资源消耗、提高响应速度和增强管理性。核心参数包括核心线程数、最大线程数、线程存活时间、任务队列、线程工厂和拒绝策略。线程池的工作流程涉及任务提交、执行流程和拒绝策略的触发。常见的线程池类型包括FixedThreadPool、CachedThreadPool、SingleThreadExecutor和ScheduledThreadPool。为避免隐含风险,推荐手动创建ThreadPoolExecutor

2025-05-23 12:21:27 1034

原创 阻塞队列BlockingQueue

BlockingQueue 是 Java 并发包中用于解决生产者-消费者问题的核心接口,具有线程安全和阻塞机制的特性。当队列满时,生产者线程会被阻塞;当队列空时,消费者线程会被阻塞。它还支持超时控制,允许在指定时间内尝试插入或获取元素。常见的实现类包括: ArrayBlockingQueue:基于数组的有界队列,适合固定容量的场景。 LinkedBlockingQueue:基于链表的队列,默认无界,适合高吞吐量场景。 PriorityBlockingQueue:支持优先级排序的无界队列,元素需实现 Comp

2025-05-23 12:19:34 419

原创 读写锁ReentrantReadWriteLock

ReentrantReadWriteLock 是一种支持读锁(共享锁)和写锁(独占锁)的同步机制,适用于读多写少的场景。其核心特性包括:读锁允许多个线程同时读取数据,写锁则独占资源,确保写操作的原子性。锁具有可重入性,支持公平和非公平模式。锁的行为场景包括读读共享、读写互斥和写写互斥,分别对应不同的并发性能。锁降级允许写锁降级为读锁,但锁升级会导致死锁。底层通过 Sync 类管理锁状态,适用于缓存、配置信息等高频读取场景,但在写操作频繁时性能可能下降。通过合理使用,可以在保证数据一致性的同时提升并发性能。

2025-05-23 12:17:59 919

原创 同步工具(Tools)

本文介绍了Java中常用的多线程同步工具类,包括CountDownLatch、CyclicBarrier、Semaphore、Exchanger和Phaser。CountDownLatch用于主线程等待多个子线程完成任务;CyclicBarrier允许多个线程相互等待,到达屏障后继续执行;Semaphore控制同时访问资源的线程数量;Exchanger用于两个线程在同步点交换数据;Phaser支持多阶段同步,允许动态增减参与者。文章通过代码示例展示了各工具类的使用方法,并对比了它们的核心特性和适用场景,帮助

2025-05-23 12:16:19 241

原创 并发容器(Collections)

在多线程环境下,Java集合类如ArrayList、HashSet和HashMap存在并发安全问题,主要表现为数据不一致、异常抛出或死循环。根本原因在于非原子性操作和结构性修改冲突。为解决这些问题,推荐使用线程安全的集合实现,如CopyOnWriteArrayList(适合读多写少场景)、CopyOnWriteArraySet(元素少、读多写少)和ConcurrentHashMap(高并发读写首选)。这些实现通过复制数组、分段锁或CAS机制,确保线程安全的同时优化性能。开发时应根据具体场景选择合适的并发容器

2025-05-23 12:15:03 733

原创 Callable

Callable 接口是 Java 中用于定义可返回结果的任务的接口,通常与线程池结合使用。通过实现 call() 方法,可以定义任务逻辑,并通过 Future 对象获取任务结果。基本使用步骤包括定义任务、提交到线程池、通过 Future 获取结果。Future 提供了阻塞获取结果、超时控制、任务取消等功能。Callable 抛出的异常会被封装到 ExecutionException 中,需通过 getCause() 获取原始异常。批量提交任务时,可以使用 invokeAll 或 invokeAny 方法。

2025-05-23 12:13:08 223

原创 生产者和消费者问题

本文介绍了Java中生产者和消费者问题的两种实现方式:Synchronized版和JUC版。在Synchronized版中,通过synchronized关键字和wait()、notifyAll()方法实现线程间的同步与通信,但存在虚假唤醒问题,需将if判断改为while循环。JUC版则使用ReentrantLock和Condition类,提供了更灵活的线程控制,避免了虚假唤醒问题。两种方式均通过线程交替执行生产和消费操作,确保共享资源num的正确性。

2025-05-23 12:11:33 119

原创 AQS详解

ReentrantLock是Java并发包中的一个可重入锁,其底层实现依赖于AQS(AbstractQueuedSynchronizer)。AQS是Java并发包的核心组件,负责管理锁的状态和线程的排队。ReentrantLock通过AQS中的state变量来记录锁的状态,初始值为0,表示未加锁。当一个线程调用lock()方法时,会通过CAS操作将state从0变为1,表示加锁成功,并记录当前加锁的线程。如果其他线程尝试加锁,发现state不为0,则会进入等待队列,直到锁被释放。释放锁时,state递减,若

2025-05-23 12:07:44 976

原创 Lock锁

Lock 接口及其实现类 ReentrantLock 提供了比 synchronized 更灵活的锁机制,支持显式加锁、解锁以及更细粒度的控制。Lock 与 synchronized 的主要区别在于实现方式、锁特性和性能表现。synchronized 是 JVM 内置的关键字,自动管理锁,适合简单同步需求;而 Lock 是 Java API 接口,需手动管理锁,支持公平锁、中断响应、超时机制和多个条件变量,适合高并发和复杂场景。Lock 的高级功能包括尝试获取锁、公平锁和条件变量,适用于读多写少场景的读写锁

2025-05-23 12:05:04 1024

原创 CAS详解

CAS(Compare And Swap)是一种无锁并发控制技术,通过比较内存值与预期值来决定是否更新为新值,依赖CPU的cmpxchg指令保证原子性。Java通过Unsafe类实现CAS,广泛应用于JUC中的原子类、AQS和并发容器。尽管CAS高效,但存在ABA问题、自旋开销和单变量限制等缺陷,可通过版本号、退避策略或锁机制解决。与锁机制相比,CAS适用于简单原子操作和低竞争场景,但在高竞争或复杂逻辑下,锁机制更为合适。最佳实践包括优先使用原子类、避免长时间自旋、优化高竞争场景以及为敏感数据加版本号。

2025-05-23 12:02:39 730

原创 JUC原子类

JUC原子类通过CAS机制实现线程安全的数值更新,避免了锁的开销,适用于高并发场景。其底层依赖Unsafe类和CPU指令cmpxchg,但存在ABA问题和自旋开销。原子类分为基本类型(如AtomicInteger)、引用类型(如AtomicReference)、数组类型(如AtomicIntegerArray)和字段更新器(如AtomicIntegerFieldUpdater),分别用于计数器、对象更新、数组操作和字段修改。通过案例展示了如何使用这些类实现线程安全的计数、自旋锁、解决ABA问题以及原子更新数

2025-05-23 11:53:54 324

原创 synchronized 实现原理

Java中的synchronized关键字通过对象头、Monitor机制和锁升级过程实现线程同步。对象头包含Mark Word和Klass Pointer,Mark Word存储锁状态信息。Monitor机制管理线程竞争,锁升级过程根据竞争情况从无锁、偏向锁、轻量级锁到重量级锁动态调整。synchronized在字节码中通过monitorenter和monitorexit指令实现,支持可重入性和排他性。其优势在于JVM自动管理锁、锁升级机制和可重入性,适用于低竞争或快速实现同步的场景。

2025-05-23 11:51:50 658

原创 redis缓存实战

fill:#333;color:#333;color:#333;fill:none;存在不存在存在不存在用户查询商品请求Redis缓存是否存在?直接返回商品数据查询数据库数据库中存在数据?写入Redis缓存返回商品数据返回失败信息。

2025-05-16 15:41:38 573

原创 Redisson 四大核心机制实现原理详解

机制实现原理可重入锁使用 RedisHash 结构存储锁名、线程唯一标识(UUID+线程ID)和重入次数。同一线程多次获取锁时重入次数递增,释放时递减,归零后删除锁。锁重试通过Pub/Sub 订阅锁释放事件避免轮询;失败后按退避策略(默认 1.5 秒)重试,直到超时或成功。WatchDog后台线程每10 秒(默认)检查锁持有状态,若锁存在则续期(重置过期时间至 30 秒)。未指定锁超时时间时自动启用。主从一致性使用:向多个独立节点加锁,需半数以上成功;

2025-05-16 11:40:40 1203

原创 redisson基础

官方定义:Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。简单来讲Redisson是一个在Redis的基础上实现的分布式工具的集合。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。Redisson实现分布式锁引入redisson依赖</</</</

2025-05-16 11:37:29 624

原创 秒杀案例讲解

mybatis generator逆向生成实体类、mapper接口与mapper.xml。修改 GoodsMapper.xml。同步 mysql 数据到 redis。修改 GoodsMapper。

2025-05-16 11:25:58 933

原创 rocketMQ

RocketMQ 是阿里巴巴 2016 年 MQ 中间件,使用 Java 语言开发,RocketMQ 是一款开源的,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、 快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。具有以下特点: 1. 能够保证严格的消息顺序 2. 提供丰富的消息拉取模式 3. 高效的订阅者水平扩展能力 4. 实时的消息订阅机制 5. 亿级消息堆积能力。

2025-05-16 11:10:31 785

原创 SpringMVC执行流程

2025-04-15 15:55:19 129

原创 java中基本数据类型与字符串类型之间相互转换

如果该系统属性存在且能够转换成Long/Integer,getInteger() /getInteger()将返回该值。如果属性不存在,或无法转换为Long/Integer,则返回 null。: 返回对应属性的整数值(以 Long/Integer 对象的形式)或 null。: 接受一个字符串参数,该参数为要查找的系统属性的名称。需要解析字符串 → 用 Long.parseLong()需要读取系统属性 → 用 Long.getLong()

2025-04-01 09:51:08 173

原创 vue双向数据绑定原理

而要取代它的Proxy有以下两个优点;可以劫持整个对象,并返回一个新对象。

2025-03-05 21:56:52 290

原创 es6中的小知识点汇总

(注意,是定义时,不是调用时)所处的。

2025-03-05 21:28:10 958

原创 手写Promise

【代码】手写Promise。

2025-03-05 21:26:18 342

原创 js中的==与===

原因是对于复合类型的值,严格相等运算比较的是,它们是否引用同一个内存地址,而运算符两边的空对象、空数组、空函数的值,都存放在不同的内存地址,结果当然是false。这个对象与字符串’foo’进行比较时,会依次调用valueOf()和toString()方法,最后返回’foo’,所以比较结果是true。具体来说,先调用对象的valueOf()方法,如果得到原始类型的值,就按照上一小节的规则,互相比较;对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。

2025-03-05 21:25:42 462

原创 虚拟DOM

DOM 将网页的结构表示为一个,其中每个元素、属性和文本都被表示为树中的一个节点。

2025-01-25 08:57:53 971

原创 js中的保护对象

es5中,对象中的每个属性,不再只是一个简单的值,还有三个相关的开关。eid:{value:属性值,writable : true/false 控制当前属性值是否可以修改enumerable : true/false 控制是否可用for in遍历到这个属性configurable : true/false ①控制是否可删除当前属性,②控制是否可修改前两个开关。

2025-01-25 08:13:11 970

原创 02-mybatis-mybatis 中的 @Mapper, @MapperScan, @Repository,mybatis.mapper-locations 的用法与区别

如果需要让多个接口都变成实现类,用@Mapper一个个添加太麻烦,这时我们在Springboot启动类添加@MapperScan,指定要扫描的mapper的包的路径,然后包下面的所有接口在编译之后都会生成相应的实现类,实现批量添加@Mapper注解。@Repository是spring提供的注解,放在类上能够将该类注册成Bean,和@Controller作用一样。@Repository也可以标注在dao层接口上,放在接口上本来就没有意义,spring中在mapper接口上写一个。

2024-11-28 19:49:50 319

原创 defineModel

随着Vue3.4版本的发布,也正式转正了。它可以简化父子组件之间的双向绑定,是目前官方推荐的双向绑定实现方式。

2024-08-14 23:14:03 655

原创 防抖和节流

就是指连续触发事件但是在设定的一段时间内中只执行最后一次。假如:设定1000毫秒执行,当你触发事件了,他会1000毫秒后执行,但是在还剩500毫秒的时候你又触发了事件,那就会重新开始1000毫秒之后再执行。代码思路是利用定时器,每次出发前先清掉以前的定时器(只要最后一次的操作。

2024-07-27 16:32:31 341

原创 04-springmvc-RequestContextHolder

该方法实现的原理是,在Controller方法开始处理请求时,Spring会将request对象赋值到方法参数中。此时request对象是方法参数,相当于局部变量,毫无疑问是线程安全的。Controller中获取request对象后,如果要在其他方法中(如service方法、工具类方法等)使用request对象,需要在调用这些方法时将request对象作为参数传入。

2024-04-07 10:10:47 939

原创 如何把已安装的nodejs高版本降级为低版本

使用nvm来管理node.js的版本真的很方便,这样就可以根据自己的需要来回切换node.js版本!最好先卸载之前的node再用nvm下载nodejs,不然可能会出错。

2024-03-04 18:58:10 12564 3

原创 4-Bean的循环依赖

问题:请聊一聊Bean的循环依赖答案:总:Bean的循环依赖指的是À依赖B,B又依赖A这样的依赖闭环问题,在Spring中,通过三个对象缓存区来解决循环依赖问题,这三个缓存区被定义到了DefaultSingletonBeanRegistry中,分别是用来存储创建完毕的Bean,用来存储未完成依赖注入的Bean,还有用来存储创建Bean的ObjectFactory。假如说现在A依赖B,B依赖A,整个 Bean的创建过程是这样的分。

2024-02-26 17:22:29 910

原创 3-Bean的生命周期

问题:请聊一聊Bean的生命周期答案:总:Bean的生命周期总的来说有4个阶段,分别是创建对象,初始化对象,使用对象以及销毁对象,而且这些工作大部分都是交给Bean工厂的doCreateBean方法完成的分首先,在创建对象阶段,先调用构造方法实例化对象,对象有了后会填充该对象的内容,其实就是处理依赖注入其次,对象创建完毕后,需要做一些初始化的操作,在这里涉及到几个扩展点执行Aware感知接口的回调方法执行Bean后置处理器的postProcessBeforeInitialization方法。

2024-02-23 18:43:08 474

原创 2-IOC容器的初始化流程

问题:请聊一聊IOC容器的初始化流程答案:总:IOC容器的初始化,核心工作是在AbstractApplicationContext.refresh()方法中完成的分:在refresh()方法中主要做了这么几件事准备BeanFactory,在这一块需要给BeanFactory设置很多属性,比如类加载器,Environment等执行BeanFactory后置处理器,这一阶段会扫描要放入到容器中的Bean信息,得到对应的BeanDefinition(注意:这里只是扫描,不创建)

2024-02-21 17:14:20 591

原创 1-SpringBoot启动流程

问题:请聊一聊SpringBoot的启动流程答案:总:SpringBoot启动,其本质就是加载各种配置信息,然后初始化IOC容器并返回分:在启动的过程中会做这么几个事情首先,当我们在启动类执行SpringApplication.run这行代码的时候,在它的方法内部其实会做两个事情创建SpringApplication对象;执行run方法。其次,在创建SpringApplication对象的时候,在它的构造方法内部主要做3个事情。

2024-02-21 16:22:45 396

原创 0-前置知识

SpringBoot框架在设计之初,为了有更好的兼容性,在不同的运行阶,段提供了非常多的扩展点,可以让程序员根据自己的需求,在整个Spring应用程序运行过程中执行程序员自定义的代码。

2024-02-21 15:44:23 897

空空如也

空空如也

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

TA关注的人

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