- 博客(67)
- 收藏
- 关注

原创 StandardThreadExecutor源码解读与使用(tomcat的线程池实现类)
StandardThreadExecutor 是 Apache Tomcat 中的一个线程池实现类,是 Tomcat 生命周期中的池化线程资源的封装。StandardThreadExecutor是为了更好地适应Tomcat容器中HTTP请求的处理而设计的。通过优先创建非核心线程来执行任务,避免了任务在等待队列中长时间积压,从而提升了服务器的响应速度。
2024-11-02 17:37:20
819
1

原创 ReentrantLock(可重入锁)源码解读与使用
ReentrantLock是一种独占式的可重入锁,位于JUC包下,是Lock接口的默认实现类。有三个特性:支持可重入,支持公平与非公平特性,提供堵塞锁和非阻塞锁两种获取方法(lock和trylock)其中内部锁的竞争是基于AQS实现的,当某一线程获取锁后,将state值+1,并记录下当前持有锁的线程,再有线程来获取锁时,判断这个线程与持有锁的线程是否是同一个线程,如果是,将state值再+1,这样就实现了锁的可重入。当线程释放锁时,将state值-1,当state值减为0时,表示当前线程彻底释放了锁,唤
2024-04-25 20:21:31
8755
52

原创 CyclicBarrier(循环屏障)源码解读与使用
CyclicBarrier可以让一组线程互相等待,直到最后一个线程也准备就绪后,它们才能继续运行。就好比几个朋友约好一起吃晚餐,必须等到所有人到齐后才能入座就餐。CyclicBarrier实现了这种"集体出发"的功能,每次所有线程就位后,它们可以执行一个预先指定的任务,然后继续向前推进。有趣的是,CyclicBarrier与CountDownLatch不同,它可以重复使用。这也从侧面体现了两者在设计理念上的差异。借鉴了AQS的精髓,CyclicBarrier内部通过ReentrantLock和Con
2024-04-23 22:00:48
7903
73

原创 CountDownLatch(倒计时器)源码解读与使用
在很多的面经中都看到过提问 CountDownLatch 的问题,正好我们最近也在梳理学习AQS(抽象队列同步器)、CAS操作等知识,而 CountDownLatch 又是JUC包下一个比较常见的同步工具类,我们今天就继续来学一下这个同步工具类!CountDownLatch 是一个多线程同步辅助类,它允许一个或多个线程等待一系列操作在其他线程中完成。这个机制类似于一场赛跑,选手们在起跑线准备,等待发令枪响后才能开始比赛。
2024-04-22 21:24:43
8133
58

原创 CAS机制(Compare And Swap)源码解读与三大问题
CAS(Compare And Swap)作为一种无锁编程技术,被广泛应用于Java的并发编程中。它通过利用CPU指令在操作数据时先比较内存值是否发生变化,如未变化则更新,否则重试循环直到成功为止,从而实现非阻塞的原子操作。CAS操作的优势在于避免了传统悲观锁导致的线程阻塞和切换开销,适用于读操作远多于写操作的应用场景。但它也存在着经典的ABA问题、无法保证多个共享变量的原子性以及在高并发写操作时自旋会导致CPU时钟周期浪费等缺陷。在JDK1.5之后,通过版本号机制来解决了ABA问题。对于长时间自旋
2024-04-21 20:26:05
8935
62

原创 利用AQS(AbstractQueuedSynchronizer)实现一个线程同步器
我们在上篇文章带领大家阅读了AQS的源码,理解了AQS的底层实现,AQS 为构建锁和同步器提供了一些通用功能的实现,今天我们就实践一下,基于AQS实现一个同步器,看看AQS如何帮助我们快速构建同步器。同步器是一种用于线程同步的工具,控制多个线程对共享资源的并发访问。如Semaphore信号量,CountDownLatch (倒计时器)、CyclicBarrier(循环屏障)都属于同步器。
2024-04-20 21:28:41
13661
67

原创 AQS(AbstractQueuedSynchronizer,队列同步器)源码解读
AQS 的全称为 AbstractQueuedSynchronizer ,翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。AQS为Java的并发包提供了强大的同步支持。通过内置的FIFO队列来完成资源获取线程的排队工作,并且利用一个被volatile关键字修饰的int类型的变量表示同步状态。AQS 为构建锁和同步器提供了一些通用功能的实现,许多同步类实现都依赖于它,如常用的ReentrantLock、Semaphore等。
2024-04-19 21:15:28
13739
48

原创 Semaphore(信号量)源码解读与使用
Semaphore 是一个在多线程环境中用于控制对共享资源的访问的同步器(synchronizer),它是 Java 5 中引入的 java.util.concurrent(JUC)包的一部分。Semaphore 维护了一个许可集,线程在执行前必须从 Semaphore 获取一个许可。如果没有许可可用,线程将阻塞等待,直到其他线程释放许可。可以用来限制数据库连接数、限制服务器可处理请求数等。
2024-04-17 20:17:25
13552
30

原创 Java多线程实战-从零手搓一个简易线程池(四)线程池生命周期状态流转实现
在前面几篇文章中,我们已经实现了线程池的核心功能:任务队列、执行逻辑以及线程管理。本次我们将继续扩展补充线程池的功能,为线程池添加生命周期管理。通过引入生命周期,我们能够更加灵活地管理和控制线程的创建、运行和销毁过程。可以更好地处理资源分配、任务调度和系统稳定性等方面的问题。
2024-04-09 21:19:28
14770
80

原创 Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现
在上一节我们实现了线程池内部的基本运转逻辑,池化了线程资源进行任务处理,细心的同学可以发现,我们上章没有划分核心线程与非核心线程的概念,在JDK官方的提供的线程池中,线程池中的线程从概念上分为核心线程和非核心线程,核心线程是线程池中长久存在的线程,默认不会被回收,而非核心线程在空闲时间超过设置的最大空闲时间时会被回收,当然,我们也可以通过设置一个属性来运行核心线程被回收。
2024-04-02 15:24:52
14655
47

原创 Java多线程实战-从零手搓一个简易线程池(二)线程池实现与拒绝策略接口定义
在前面的文章中,我们讲解了任务堵塞队列的实现,这篇文章会基于任务堵塞队列实现一个简易的线程池,在后续的文章中,还会继续对本章编写的线程池进行功能扩展和优化。
2024-03-27 14:44:09
244693
6

原创 Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列
开个新坑-手搓简易线程池。本系列文章将从零开始,一步步手工编码实现一个简单但功能完备的线程池。我们将逐步介绍线程池的各个核心组件,并分析它们的作用和实现思路。通过这个过程,我们可以更好地掌握多线程编程的技巧,并培养编码能力和系统性思维。
2024-03-25 20:22:10
249984
82
原创 Java 21中的虚拟线程:优势、应用及优化
虚拟线程在 Java 21 正式发布,这是一项重量级的更新。在引入虚拟线程之前,java.lang.Thread 包已经支持所谓的平台线程(Platform Thread),也就是没有虚拟线程之前,我们一直使用的线程。JVM 调度程序通过平台线程(载体线程)来管理虚拟线程,一个平台线程可以在不同的时间执行不同的虚拟线程(多个虚拟线程挂载在一个平台线程上),当虚拟线程被阻塞或等待时,平台线程可以切换到执行另一个虚拟线程。
2024-06-04 21:24:15
11126
原创 ElasticSearch IK分词器的安装、词典扩展与停用
ES默认的分词器对中文词语分词效果很不好,每个中文都分成了一个词,所以我们需要安装一个支持中文分词的分词器,使用较多的就是IK分词器。此外我们可以通过修改配置来实现对分词器词典的扩展和停用。
2024-05-24 08:00:00
12688
4
原创 基于Docker的ElasticSearch、Kibana服务搭建并开启用户鉴权
发现有段时间没更文了,突然想到ES还没有发过相关的文章,翻了翻以前的笔记,又可以水几篇笔记了哈哈。博主这里推荐使用至少2G运行内存的的服务器作为学习平台,因为ES服务占用的内存还是比较大的,除去ElasticSearch外我们还需要部署一个可视化操作工具Kibana。如果你是Linux centos系统的话,下面的指令可以一路CV完成服务的部署。部署ES主要是部署两个服务,一是ES服务本身,二是Kibana作为可视化面板。目前ES的部署模式使用的是单机模式,操作比较简单,后续我们可能会结合K8S实现ES的
2024-05-22 15:28:09
13275
3
原创 Kubernetes学习-深入Pod篇(三) Pod的生命周期与PreStop事件
和一个个独立的应用容器一样,Pod 也被认为是相对临时性(而不是长期存在)的实体。Pod 会被创建、赋予一个唯一的 ID(UID), 并被调度到节点,并在终止(根据重启策略)或删除之前一直运行在该节点。我们一般将Pod对象从创建到终止的这段时间范围称为Pod的生命周期,这次我们接着来学习Pod的生命周期。Pod是Kubernetes中的基本工作单元,具有独特的生命周期,从创建到终止,期间会经历不同的状态和阶段。初始化容器(init container)过程。
2024-05-16 21:17:49
1267
7
原创 Kubernetes学习-深入Pod篇(二) 探针技术详解与应用
在 Kubernetes(k8s)中,Pod 的探针(Probe)是一种健康检查机制,用于确保 Pod 中的容器能够正常工作。Kubernetes 通过探针来检查容器的状态,以确保服务能够可靠地运行。探针主要有三种类型:存活探针,就绪探针,启动探针。探针可以通过三种方式探测:HTTP GET方式,TCP套接字方式,Exec命令方式。探针机制是 Kubernetes 自动化管理和自愈能力的重要组成部分,它确保了 Pod 的健康状态,提高了应用的可用性和稳定性。
2024-05-15 08:00:00
13930
1
原创 解决 XXL-Job 端口额外占用问题 小结
最近博主在Spring整合XXL-JOB到项目时发现了个问题,注册执行器需要额外占用端口,也就是我们每启动一个程序,除了程序本身的API端口外,还需要额外开放一个执行器端口。这样看起来没啥,但是如果放到Docker容器中,用户不显示指定执行器端口的话,默认占用9999端口,假如我想启动两个实例,那么必定会发生端口冲突,也就是我必须为每个实例指定执行器端口,假如我有10个实例,那也太麻烦了的吧,然后去xxl-job github查看,发现issue都已经1.2k个了,这个问题也老早就有人提了Issue,可
2024-05-13 13:49:50
4242
3
原创 Kubernetes学习-深入Pod篇(一) 创建Pod,Pod配置文件详解
我们在前面的文章讲解了Kubernetes的核心概念和服务部署,接下来我们进入实战篇,从Pod入手学习K8S的使用在本文中,我们探讨了 Kubernetes(K8S)中Pod的概念,并从 Pod 入手,学习如何在 K8S 集群中部署和管理服务。
2024-05-12 08:00:00
3893
6
原创 Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
我们在前面两篇文章完成了Master服务和Node服务的部署,但是还是存在一点问题,看下图我们可以在Master服务正常使用kubectl命令行工具,命令行工具默认会访问本机,故在Master服务器上是正常的,但是对于Node服务他们不知道api-sevrer的地址,去请求本机,就会无法正常kubectl本次我们就先解决这个小问题。
2024-05-11 08:00:00
2505
3
原创 Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
我们在上一篇文章完成了Matster结点的部署,这次我们接着来部署Node服务,注意,我Node服务是部署在另外两台服务器上。整体的部署流程还是有点长的,特别是下载镜像时可能因网络问题会等待很久,需要一点耐心。跟着教程来应该没有大问题(有问题可以评论区留言,一起解决)。
2024-05-10 08:00:00
3332
9
原创 Kubernetes学习-集群搭建篇(一) 搭建Master结点
Kubernetes集群的搭建方式有很多,我们准备通过kubeadm方式搭建k8s集群,本文记录了搭建的运行环境,以及matser结点的搭建过程
2024-05-09 17:19:37
6145
3
原创 Mybatis逆向工程笔记小结
我们在开发传统的Maven项目或者SpringBoot项目过程中,最终处理的就是对于数据的读与存,这时就免不了写对象关系映射代码,实体类、mapper、mapper.xml等代码,若存在大量的增删改查功能的话,我们开发时就会不断重复相同的操作,大大降低了工作效率。本文简单介绍了Mybatis逆向工程的两种实现方案,方案一实现复杂,但可以满足基本的增删改查的实现,博主还是更偏向于第二种哈哈,可视化操作起来比较简单,大家可以根据自己的日常开发场景,进行合理选择。
2024-05-06 20:27:00
6785
76
原创 StampedLock(戳记锁)源码解读与使用
StampedLock通过引入乐观读锁来解决写线程饥饿的问题。乐观读锁不会阻塞写线程,它允许一个线程在没有写锁的情况下读取数据,并且在读取数据后,通过戳记(stamp)来验证数据是否在读取过程中被修改。如果数据没有被修改,那么读操作成功;如果数据被修改了,那么可以尝试再次获取乐观读锁或者转换为普通的读锁。需要注意的是,StampedLock的使用比ReadWriteLock更加复杂,需要仔细处理锁的获取、验证和释放过程,以避免死锁和其他并发问题。此外,StampedLock不支持重入,因此在需要可重入锁
2024-05-04 13:48:30
4656
72
原创 ReentrantReadWriteLock(可重入读写锁)源码解读与使用
ReentrantReadWriteLock是 Java 提供的一个高级同步机制,特别适用于读多写少的场景。它维护了一对锁,一个用于读操作,允许多个线程同时读取资源,另一个用于写操作,确保在写入时独占访问。相比于ReentrantLock 直接锁读写会有更细的锁粒度,提高读写的并发性能,但也存在线程饥饿问题,也就是在写的时候,其他线程不能读也不能写,这时候若有大量的读操作的话,就会让很多线程等待,造成饥饿问题,在StampedLock中解决了这个问题,下次讲解。
2024-04-30 15:49:25
2181
74
原创 Kubernetes学习-核心概念篇(三) 核心概念和专业术语
本文主要介绍了服务的分类、资源和对象以及对象规约和状态。服务的分类主要包括有状态服务和无状态服务,有状态服务需要持久化数据并且对数据一致性有要求,例如数据库、消息队列等;无状态服务不需要保存用户数据或状态,例如web服务器、API服务器等。资源和对象介绍了K8S中资源的定义和分类,资源是集群内部用于表示系统组件的对象,可以分为元数据型、集群级和命名空间级。对象规约和状态中,"spec"表示对象的期望状态,而"status"表示对
2024-04-28 21:03:17
1935
86
原创 Kubernetes学习-核心概念篇(二) 集群架构与组件
我们在前面的文章中讲解了什么是Kubernetes,以及为什么需要Kubernetes,接下来我们继续学习Kubernetes的相关核心概念-集群架构与组件,本章内容主要是讲解Kubernetes的内部组成架构以及一些相关组件的定义,理解这些内容更方便我们后续学习具体的操作。在讲解K8S的架构前,我们首先了解下K8S的前身Borg,Borg是Google的内部大型集群管理系统,这个大型集群管理系统算是Kubernetes的前身。Borg的架构图如下:
2024-04-27 19:58:05
5320
50
原创 Kubernetes学习-核心概念篇(一) 初识Kubernetes
Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种机制。Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础
2024-04-26 19:56:24
5144
42
原创 Redis实现延迟任务的几种方案
延迟任务(Delayed Task)是指在未来的某个时间点,执行相应的任务。也就是说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行。Redis 本身并没有直接提供延迟任务的功能,但可以通过一些策略和手段,在 Redis 中手动实现延迟任务。
2024-04-15 19:27:25
20261
46
原创 Springboot 大事务问题的常用优化方案
大事务是指运行时间比较长,操作的数据比较多的事务123。例如,执行超过5秒、10秒、1分钟等。大事务的产生原因包括操作的数据比较多、大量的锁竞争、事务中有其他非数据库的耗时操作等。在实际项目开发中,我们应该尽量避免大事务的情况。
2024-04-11 19:54:23
16546
176
原创 Java中利用BitMap位图实现海量级数据去重
有许多方法可以用来去重,比如使用列表、集合等等,但这些方法通常只适用于一般情况。然而,当涉及到大量数据去重时,常见的 Java Set、List,甚至是 当涉及到大量数据去重时,常见的 Java Set、List,甚至是 Java 8 的新特性 Stream 流等方式就显得不太合适了。在处理大量数据的需求场景下,我们不得不提及 BitMap。
2024-04-07 10:30:42
16780
81
原创 深入理解Java内存模型及其作用
当问到 Java 内存模型的时候,一定要注意,Java 内存模型(Java Memory Model,JMM)它和 JVM 内存布局(JVM 运行时数据区域)是不一样的,它们是两个完全不同的概念。Java 内存模型(Java Memory Model,简称 JMM)是一种规范,它定义了 Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式,即规范了 Java 虚拟机与计算机内存之间是如何协同工作的。
2024-04-03 10:19:06
16009
99
原创 Springboot解决跨域问题方案总结(包括Nginx,Gateway网关等)
跨域问题是浏览器为了保护用户的信息安全,实施了同源策略(Same-Origin Policy),即只允许页面请求同源(相同协议、域名和端口)的资源,当 JavaScript 发起的请求跨越了同源策略,即请求的目标与当前页面的域名、端口、协议不一致时,浏览器会阻止请求的发送或接收。
2024-03-23 10:19:44
255146
196
原创 Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
CompletableFuture为Java提供了强大的异步编程能力,可以极大地提高应用的并发能力和响应速度。通过并行执行多个查询任务,我们可以大幅减少接口的响应时间,优化用户体验。同时,CompletableFuture的代码风格函数式、简洁、优雅,也使得代码更加易读易维护。但是,异步编程也不是万能的,它需要开发者转变思维模式,还需要权衡利弊。在实际项目中,我们可以结合其他优化手段,选择合适的方案,以达到最佳的性能效果。
2024-03-20 13:56:32
256431
99
原创 Spring Boot 实现程序的优雅退出
在服务器环境中,确保应用程序能够平滑关闭并处理完所有现有请求是一个重要的需求。Spring Boot 为我们提供了优雅退出的功能,使应用程序能够在关闭时正常处理完所有当前请求,避免请求被中断导致数据丢失或不一致等问题。本文将全面介绍如何在 Spring Boot 应用程序中实现优雅退出。
2024-03-18 20:21:09
257360
204
原创 Java多线程实战-CountDownLatch模拟压测实现
当多个线程需要协调和同步执行任务时,Java 中的 CountDownLatch(倒计时器)是一个常用的工具类。它可以帮助开发者实现线程之间的同步,确保某些线程在其他线程完成任务后再继续执行。牵着猫散步的鼠鼠。本文将介绍 CountDownLatch 的基本原理、用法以及示例代码,最后会使用CountDownLatch完成一个简单的压测实现。
2024-03-17 21:20:55
254856
69
原创 Java多线程实战-异步操作日志记录解决方案(AOP+注解+多线程)
异步日志记录是一种提升系统性能和可维护性的有效手段。牵着猫散步的鼠鼠。通过将日志记录操作异步化,不仅可以减少对业务处理流程的影响,还可以提高日志处理的灵活性和扩展性。然而,实现异步日志记录机制也伴随着一定的挑战,如日志的实时性、顺序性和丢失风险等问题。
2024-03-16 09:00:00
258147
162
原创 Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
本文将介绍如何通过Java来实现一个多线程下载器。作者:牵着猫散步的鼠鼠
2024-03-10 23:38:03
257974
154
原创 Java8 CompletableFuture异步编程-进阶篇
本篇文章我们继续学习CompletableFuture相关的进阶知识。作者:牵着猫散步的鼠鼠
2024-03-09 22:57:48
256197
60
原创 Java8 CompletableFuture异步编程-入门篇
CompletableFuture是Java8中提供的强大的异步编程类。作者:牵着猫散步的鼠鼠
2024-03-07 08:39:31
257101
51
繁体简体字幕转换工具1
2024-02-11
Snipaste - 高效桌面截图与贴图神器(类似QQ截图)
2024-02-07
Gif123 屏幕Gif录制工具 -windows
2024-02-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人