自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java并发编程第十篇(ThreadPoolExecutor线程池组件分析)

在大部分JVM上, 用户线程与操作系统内核线程是1:1的关系, 也就是说每次创建回收线程都要进行内核调用, 开销较大。那么有了线程池, 就可以重复使用线程资源, 大幅降低创建和回收的频率。此外, 也能一定程度上避免有人在写BUG时, 大量创建线程导致资源耗尽。* **便于管理** 线程池可以帮你维护线程ID、线程状态等信息, 也可以帮你统计任务执行状态等信息。理解了线程池的意义, 那么本文的主角便是JUC提供的线程池组件: ThreadPoolExecutor.请注意, 有人会将

2025-07-25 22:11:09 1069

原创 Java并发编程第九篇(ConcurrentHashMap组件分析)

之前我们说到这样一个常见场景: 当A线程正在修改HashEntry数组(属性名为table)的某个桶, 此时B线程也想要修改这个桶, 但是A线程持有了独占锁, 所以B线程只能等待或重试, 若只是干等或不断重试, 可能会是一种浪费, 所以有一种优化思路就是让B线程在重试的过程中抽空去预先完成一些后续将会用到的准备工作。, 这就相当于只用一把锁, 锁住了整个数组资源。需要注意的是, key最好使用不可变类型的对象, 否则当对象本身产生变化, 重新计算key的hashCode时会与之前的不一样, 导致查找错误。

2025-07-25 14:00:00 628

原创 Java并发编程第八篇(CountDownLatch组件分析)

CountDownLatch作为开发中最常用的组件, 也作为面试中被问到的最高频的锁之一, 我们有必要来聊聊它的作用以及内部构造。首先尝试用一句话对CountDownLatch进行概括: CountDownLatch基于AQS, 它实现了闩锁, 在开发中可以将其用作任务计数器。若想要较为系统地去理解这些特性, 我觉得最好的方式就是通过源码, 在一览源码之后自己再动手实践一遍, 这样就能够做到知其然并知其所以然。如果你从来没有接触过CountDownLatch, 那么可能会好奇, 到底什么是闩锁(

2025-07-24 22:06:32 770

原创 Java并发编程第七篇(ReeentrantLock组件分析)

ReeentrantLock作为开发中最常用的组件, 也作为面试中被问到的最高频的锁之一, 我们有必要来聊聊它的作用以及内部构造。首先尝试用一句话对ReeentrantLock进行概括: ReentrantLock基于AQS, 它实现了公平锁和非公平锁, 在开发中可以用它对共享资源进行同步。此外, 和synchronized一样, ReentrantLock支持可重入, 但ReentrantLock在调度上更灵活, 支持更多丰富的功能。这段话中, 包含了一些关键词, 我将其标注出来, 并且形成一张思

2025-07-24 18:17:00 1028

原创 Java并发编程第六篇(AQS设计理念与源码解析)

在JUC中, 我认为最核心的组件便是AQS, 可以这么理解, AQS是对CAS的一种封装和丰富, AQS引入了独占锁、共享锁等性质。基于AQS, JUC中提供了更多适用于各种预设场景的组件, 当然你也可以基于AQS开发符合自身业务场景的组件。所以, AQS作为承下启上的重点, 我们需要仔细来看。

2025-07-24 17:06:32 962

原创 Java并发编程第五篇(final关键字在多线程中的应用)

有考虑过final在多线程并发的情况吗?在java内存模型中我们知道java内存模型为了能让处理器和编译器底层发挥他们的最大优势,对底层的约束就很少,也就是说针对底层来说java内存模型就是一弱内存数据模型。同时,处理器和编译为了性能优化会对指令序列有编译器和处理器重排序。那么,在多线程情况下,final会进行怎样的重排序?会导致线程安全的问题吗?下面,就来看看final的重排序。

2025-07-21 17:37:33 822

原创 Java并发编程第四篇(彻底理解volatile)

synchronized是阻塞式同步,在线程竞争激烈的情况下会升级为重量级锁。而volatile就可以说是java虚拟机提供的最轻量级的同步机制。但它同时不容易被正确理解,也至于在并发编程中很多程序员遇到线程安全的问题就会使用synchronized。Java内存模型告诉我们,各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。线程在工作内存进行操作后何时会写到主内存中?这个时机对普通变量是没有规定的,而针对volatile修饰的变量给java虚拟机特殊的约定,线程

2025-07-18 17:36:15 862

原创 Java并发编程第三篇(深入解析Synchronized)

/ 共享变量// 创建10个线程i < 10;i++) {try {// 等待所有线程执行完毕@Override// 每个线程对count累加100万次i++)count++;这段代码的意图很明确:开启10个线程,每个线程都对静态变量count累加100万次。从逻辑上推断,最终结果理应是。然而,如果你运行这段代码,会发现几乎每次都得不到这个正确答案,而且每次的运行结果都可能不同。这是为什么呢?有什么解决方案?这就是我们今天要深入探讨的核心议题。

2025-07-17 22:30:30 860

原创 Java并发编程第二篇(搞懂JMM——从硬件根源到并发实践)

“了解过JMM吗?为什么要有JMM?知道8种内存交互操作吗?为什么要有这八种操作?了解过内存屏障吗?那为什么需要内存屏障呢?了解过happens-before规则吗?原子性、可见性、有序性在Java里到底是怎么保证的呢?”面对面试官这样一套连环炮,是不是感觉很力不从心?是不是感觉大脑的知识储备瞬间就被掏空了?别怕,要彻底搞懂JMM,我们不能靠死记硬背,而是要像侦探一样,从问题的最源头开始追溯。

2025-07-17 18:26:32 1120

原创 Java并发编程第一篇(从零开始:一文读懂Java并发编程核心基础)

为什么需要用到并发?凡事总有好坏两面,这其中的权衡(trade-off)是什么,也就是说并发编程具有哪些缺点?以及在进行并发编程时,我们应该了解和掌握的核心概念又是什么?这篇文章将主要围绕这三个问题,为你揭开Java并发编程的神秘面纱。

2025-07-17 17:09:04 842

原创 RabbitMQ第三章(企业级MQ应用方案)

消息可靠性保障是MQ系统的关键问题,本文详细分析了消息从生产者到消费者全链路可能丢失的环节,并提出了三方面解决方案:确保生产者可靠发送、MQ可靠存储、消费者可靠处理。重点介绍了生产者侧的可靠性机制,包括重试机制和确认机制(Publisher Confirm和Publisher Return),通过配置超时重试参数、异步回调处理回执等方式,有效解决了网络故障、路由失败等场景下的消息丢失问题。文中提供了SpringAMQP的具体配置示例和代码实现,展示了如何通过CorrelationData获取消息投递状态,为

2025-07-15 11:49:04 1268 1

原创 RabbitMQ第二章(RocketMQ的五大工作模式)

本文介绍了RabbitMQ的三种消息队列模式: Simple模式:最简单的生产消费模式,生产者发送消息到队列,消费者监听队列并处理消息。需注意消息丢失风险,建议手动ACK确认机制。 Work模式:多个消费者竞争同一队列消息,通过设置prefetch=1实现轮询分发,确保消息均衡处理。适用于高并发场景。 Exchange发布订阅模式: Fanout交换机:广播模式,消息发送到交换机后,所有绑定队列都会收到,实现一对多分发。 Direct交换机:路由模式,通过bindingKey精准匹配队列,实现不同消息定向投

2025-07-08 22:28:40 1030

原创 RabbitMQ第一章(MQ基础与RocketMQ使用手册)

消息队列(MQ)是一种实现系统解耦、异步处理和流量削峰的关键技术。其主要优点包括:通过异步通信降低系统耦合度,提升响应速度,缓解高并发压力。但同时也带来系统可用性降低、复杂度增加和数据一致性问题。RabbitMQ作为主流MQ实现,具有AMQP协议支持、活跃社区等优势,适用于服务异步通信、顺序消费等场景。其核心组件包括Broker、Exchange、Queue等,通过路由规则实现消息分发。虽然引入MQ会显著增加系统复杂度,但在高并发、分布式场景中仍是不可或缺的架构组件。

2025-07-08 17:39:34 690

原创 8086汇编语言教程(入门到实践)

8086汇编语言是经典的低级语言之一,用于编程8086系列处理器。它以其简洁的指令集、灵活的内存操作和硬件控制能力成为学习汇编语言和计算机底层知识的理想起点。本文将带你从基础入门,逐步掌握8086汇编语言的核心概念和简单编程技巧。

2024-11-22 18:11:41 1999

原创 Flowable第三篇、Flowable之任务分配(任务分配、流程变量、候选人和候选人组)

在Flowable中,任务分配和流程变量是两个核心概念,主要用于控制流程的执行和数据流转。任务分配的作用是确保用户任务能够被正确的流程或用户组处理,它可以通过指定接纳人、候选用户/用户组、动态分配等方式实现。机制能够明确任务的处理人,提高工作效率,并通过动态分配或规则分配适应复杂的业务需求,同时实现权限控制,确保任务另外,流程变量用于在流程中存储和提交数据的容器,其贯穿整个生命周期的流程,支持周期条件判断、动态分配、数据共享等功能。流程变量,可以实现数据的动态提交和流程逻辑的灵活调整,使流程变得更加一致和标

2024-11-21 21:54:28 2009

原创 Flowable第二篇、万字解析Flowable 表结构(79 张表都是干嘛的?)

当我们使用 Flowable 流程引擎的时候,虽然我们使用的是各种 API,但是小伙伴们都知道,这些 API 本质上操作的都是底层的数据表,Flowable 默认一共生成了 79 张数据表,种数量的表对于刚开始学习小白来说简直就是天花乱坠,而了解这些数据表,有助于我们更好的理解 Flowable 中的各种 API,为了方便理解我将带大家捋一捋 Flowable 中的数据表都有哪些,以及这些表都是干嘛用的。

2024-11-21 19:37:11 2799

原创 Flowable第一篇、快速上手(Flowable安装、配置、集成)

Flowable是一个轻量级、高效可扩展的工作流和业务流程管理(BPM)引擎,支持在Java应用程序中实现复杂的工作流自动化。Flowable最初是作为Activiti项目的一个分支发展而来的,但它现在已经成为一个独立的开源项目,并在企业级应用中得到了广泛使用

2024-11-21 19:24:36 10240

原创 Redis缓存技术 基础第三篇(Redis实现短信验证)

当注册完成后,用户去登录会去校验用户提交的手机号和验证码,是否一致,如果一致,则根据手机号查询用户信息,不存在则新建,最后将用户数据保存到redis,并且生成token作为redis的key,当我们校验用户是否登录时,会去携带着token进行访问,从redis中取出token对应的value,判断是否存在这个数据,如果没有则拦截,如果存在则将其保存到threadLocal中,并且放行。

2024-10-24 20:18:52 1069

原创 Redis缓存技术 基础第二篇(Redis的Java客户端)

Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式。为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。3,读取Redis时,手动把读取到的JSON反序列化为对象。2,写入Redis时,手动把对象序列化为JSON。

2024-09-26 12:08:09 1291

原创 Redis缓存技术 基础第一篇(快速入门与安装部署)

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

2024-09-25 21:04:12 1310

原创 基础数据结构与算法第二篇(链表)

在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续

2024-07-30 18:31:31 532

原创 基础数据结构与算法第一篇(递归与时间空间复杂度)

在计算机科学领域,数据结构是一种数据组织、管理和存储格式,通常被选择用来高效访问数据。数据结构是一种存储和组织数据的方式,旨在便于访问和修改可以说,**程序 = 数据结构 + 算法**,它们是每一位程序员的基本功。

2024-07-29 19:33:04 1028

原创 Spring Security第三章(授权管理)

授权管理的实现在SpringSecurity中非常灵活,可以帮助应用程序实现以下两种常见的授权需求:用户-权限-资源:例如张三的权限是添加用户、查看用户列表,李四的权限是查看用户列表 用户-角色-权限-资源:例如 张三是角色是管理员、李四的角色是普通用户,管理员能做所有操作,普通用户只能查看信息

2024-07-24 18:16:52 714

原创 Spring Security第二章(Security的自定义配置与用户认证)

实际开发的过程中,我们需要应用程序更加灵活,可以在SpringSecurity中创建自定义配置文件UserDetailsService用来管理用户信息,InMemoryUserDetailsManager是UserDetailsService的一个实现,用来管理基于内存的用户信息。 创建一个WebSecurityConfig文件: 定义一个@Bean,类型是UserDetailsService,实现是InMemoryUserDeta

2024-07-24 16:22:42 1177

原创 Spring Security第一章(Security快速入门与底层原理)

Spring Security 是一个提供身份验证、授权和防御常见攻击的框架。它为保护命令式和响应式应用程序提供了一流的支持,是保护基于 Spring 的应用程序的事实标准。功能:身份认证(authentication)授权(authorization)防御常见攻击(protection against common attacks)

2024-07-24 09:30:28 814

原创 SpringCloud第六篇(微服务保护)

微服务保护的方案有很多,比如:请求限流,线程隔离,服务熔断这些方案或多或少都会导致服务的体验上略有下降,比如请求限流,降低了并发上限;线程隔离,降低了可用资源数量;服务熔断,降低了服务的完整度,部分服务变的不可用或弱可用。因此这些方案都属于服务降级的方案。但通过这些方案,服务的健壮性得到了提升,接下来,我们就逐一了解这些方案的原理。

2024-07-20 15:56:05 923

原创 SpringCloud第五篇(配置管理)

微服务共享的配置可以统一交给Nacos保存和管理,在Nacos控制台修改配置后,Nacos会将配置变更推送给相关的微服务,并且无需重启即可生效,实现配置热更新。网关的路由同样是配置,因此同样可以基于这个功能实现动态路由功能,无需重启网关即可修改路由配置。

2024-07-20 11:37:19 925

原创 SpringCloud第四篇(微服务网关)

顾明思议,网关就是网络的关口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。现在,微服务网关就起到同样的作用。前端请求不能直接访问微服务,而是要请求网关:- 网关可以做安全控制,也就是登录身份校验,校验通过才放行- 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去

2024-07-19 17:32:47 1254

原创 SpringCloud第三篇(服务中心与OpenFeign)

在上一章我们实现了微服务拆分,并且通过Http请求实现了跨微服务的远程调用。不过这种手动发送Http请求的方式存在一些问题。 试想一下,假如商品微服务被调用较多,为了应对更高的并发,我们进行了多实例部署此时,每个item-service的实例其IP或端口不同了。为了解决上述问题,就必须引入注册中心的概念了,接下来我们就一起来分析下注册中心的原理。

2024-07-13 20:08:06 664

原创 SpringCloud第二篇(如何将大型项目拆分成微服务项目)

这一章我们从单体架构的优缺点来分析,看看开发大型项目采用单体架构存在哪些问题,而微服务架构又是如何解决这些问题的

2024-07-13 11:32:48 1506

原创 SpringCloud第一篇(Docker基础)

我们即将进入微服务阶段学习,微服务项目动辄就是几十台、上百台服务需要部署,有些大型项目甚至达到数万台服务。而**由于每台服务器的运行环境不同,你写好的安装流程、部署脚本并不一定在每个服务器都能正常运行**,经常会出错。这就给系统的部署运维带来了很多困难。我们今天要学习的Docker技术。就是解决此问题的,有了Docker以后项目的部署如丝般顺滑,大大减少了运维工作量。即便你对Linux不熟悉,你也能轻松部署各种常见软件、Java项目。

2024-07-08 21:26:55 914

原创 线程的生命周期和状态控制

线程的生命周期,就是一个线程从创建到消亡的过程。关于Java中线程的生命周期,首先看一下下面这张较为经典的图:当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)五种不同的状态。尤其是当线程启动以后,它不可能一直“霸占”着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。

2024-06-21 15:39:38 1165

原创 基于Java的多线程的创建

发现创建新执行线程有两种方法。1. 一种方法是将类声明为Thread的子类。该子类应重写 Thread 类的run()方法。创建对象,开启线程。run()方法相当于主线程的main()方法。2. 另一种方法是声明一个实现Runnable接口的类。该类然后实现run()方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。

2024-06-21 15:31:33 868

原创 多线程概述

多线程是Java语言的重要特性,大量应用于网络编程、服务器端程序的开发,最常见的UI界面底层原理、操作系统底层原理都大量使用了多线程。我们可以流畅的点击软件或者游戏中的各种按钮,其实,底层就是多线程的应用。UI界面的主线程绘制界面,如果有一个耗时的操作发生则启动新的线程,完全不影响主线程的工作。当这个线程工作完毕后,再更新到主界面上。我们可以上百人、上千人、上万人同时访问某个网站,其实,也是基于网站服务器的多线程原理,如果没有多线程,服务器处理速度会极大降低。在学习多线程之前,我们先要了解几个关于多线

2024-06-19 21:34:10 1113

原创 多线程多进程的python爬虫脚本项目(可爬起点小说VIP内容)

在当今的网络时代,信息传播趋于自由化且高速发展,无数的信息倾泻而下,可以从互联网获取的信息类型有很多,例如新闻、博客、论坛,乃至小说。对于读者来说,如果能有一种程序它可以自动地从网络上抓取我们需要的小说,那么阅读将会变得更加快捷和便利。为此,我计划设计并实现一个网络爬虫程序,以自动爬取起点中文网的特定小说并下载到本地。

2024-06-19 18:03:00 3966 9

原创 SpringBoot实用开发篇第七章(监控技术)

对于现代的互联网程序来说,规模越来越大,功能越来越复杂,还要追求更好的客户体验,因此要监控的信息量也就比较大了。由于现在的互联网程序大部分都是基于微服务的程序,一个程序的运行需要若干个服务来保障,因此第一个要监控的指标就是服务是否正常运行,也就是监控服务状态是否处理宕机状态。

2024-06-01 17:04:51 979

原创 SpringBoot实用开发篇第六章(整合第三方技术,ActiveMQ,RabbitMQ,RocketMQ,Kafka)

springboot整合第三方技术第三部分我们来说说邮件系统,发邮件是java程序的基本操作,springboot整合javamail其实就是简化开发。不熟悉邮件的小伙伴可以先学习完javamail的基础操作,再来看这一部分内容才能感触到springboot整合javamail究竟简化了哪些操作。简化的多码?其实不多,差别不大,只是还个格式而已。

2024-06-01 12:31:04 1275

原创 SpringBoot实用开发篇第五章(整合第三方技术,jetcache,j2cache,Task)

jetcache严格意义上来说,并不是一个缓存解决方案,只能说他算是一个缓存框架,然后把别的缓存放到jetcache中管理,这样就可以支持AB缓存一起用了。并且jetcache参考了springboot整合缓存的思想,整体技术使用方式和springboot的缓存解决方案思想非常类似。下面咱们就先把jetcache用起来,然后再说它里面的一些小的功能。

2024-05-30 22:16:50 1295

原创 SpringBoot实用开发篇第四章(整合缓存技术)

通过本章的学习,可以将之前学习的springboot整合第三方技术的思想贯彻到底,还是那三板斧。导坐标、做配置、调API。​ springboot能够整合的技术实在是太多了,可以说是万物皆可整。本章将从企业级开发中常用的一些技术作为出发点,对各种各样的技术进行整合。

2024-05-28 19:21:42 938

原创 SpringBoot实用开发篇第三章(数据层解决方案操作)

本章节主要内容都是和数据存储与读取相关,前期学习的知识与数据层有关的技术基本上都围绕在数据库这个层面上,所以本章要讲的第一个大的分支就是SQL解决方案相关的内容,除此之外,数据的来源还可以是非SQL技术相关的数据操作,因此第二部分围绕着NOSQL解决方案讲解

2024-05-26 21:35:11 942

空空如也

空空如也

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

TA关注的人

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