自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java动态代理——原理详解&源码分析

动态代理的使用示例说到Java的动态代理相信很多开发者都非常熟悉了,但是为了之后更好的对动态代理的原理和源码进行讲解分析,接下来还是先来了解下动态代理的实际使用示例:现在有这样一个场景:明星Michel有两个技能,唱歌、跳舞明星都会有个经纪人,他们的工作是帮明星处理各种除了唱歌、跳舞的其他事务演唱会负责人需要邀请明星Michel来现场唱跳,然后联系Michel的经纪人告知请求下面由代码进行演示,首先创建明星接口,定义唱跳方法:public interface Starter {

2022-02-09 10:25:07 791 1

原创 Seata框架源码分析——TCC模式

TCC模式使用示例本文旨在针对Seata框架的TCC模式的源码进行讲解分析,在此不过多介绍Seata框架。如果想了解更多有关Seata框架的细节,建议可以阅读我的另外一篇博客:Seata框架源码分析——AT模式为了更新方便之后的源码分析讲解,首先来看下TCC模式的使用示例:与AT模式的使用非常类似,TCC模式都是使用注解达到分布式事务控制的效果,使用成本非常低。业务调用方在接口方法上使用@GlobalTransactional注解,开启全局事务@Servicepublic class Orde

2022-02-05 21:39:58 930

原创 Seata框架源码分析——AT模式

Seata框架介绍Seata(Simple Extensible Autonomous Transaction Architecture) 是 阿里巴巴开源的分布式事务中间件,以高效并且对业务 0 侵入的方式,解决微服务场景下面临的分布式事务问题。对于分布式事务和Seata框架本身的介绍本文就不再多赘述了,想了解更多Seata框架的细节,建议阅读Seata中文文档(相当详细和易懂):http://seata.io/zh-cn/docs/overview/what-is-seata.htmlAT模式介绍

2022-01-29 16:25:02 2851

原创 MySQL查看 事务进程 && 锁 命令

SELECT * FROM information_schema.INNODB_TRX; – 查看事务进程SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; – 查看锁SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; – 查看锁等待情况

2021-10-05 11:40:47 334

原创 RocketMQ源码解析——Consumer

目录:了解消息消费者——Consumer:消息消费以组的模式开展,一个消费组内可以包含多个消费者,每个消费者可以订阅多个主题,消费组之间有负载均衡(集群)模式和广播模式两种消费模式:负载均衡(集群)模式:主题下的同一条消息,只允许其中一个消息消费者进行消费广播模式:主题下的同一条消息,将被集群内所有的消费者消费一次消息消费者和服务器之间的消息传递也有两种模式,推送模式、拉取模式:推送模式:当消息到达服务器之后,服务器推送消息给消息消费者(所谓的推送模式实际上是基于拉取模式实现的,在以下的源

2021-09-25 17:46:52 658

原创 RocketMQ源码解析——消息存储

目录1. 了解RocketMQ中的消息存储:我们可以将RocketMQ整个发送消息的过程看做以下几个步骤:消息生产者发送消息,并等待队列返回ACK消息队列收到消息,并将消息进行持久化存储,在存储中新增一条消息记录返回ACK给生产者(相当于告知生产者消息已经发送成功)消息队列push消息给对应的消费者,然后等待消费者返回ACK如果消息消费者在指定时间内成功返回ACK,那么消息队列就会认为消息消费成功,在存储中删除消息;如果消息队列在指定时间内没有收到ACK,则会认为消息消费失败,就会尝试重新

2021-09-20 18:19:01 660

原创 RocketMQ源码解析——Producer

目录:了解消息生产者——Producer:RocketMQ中的消息生产者,主要负责生产消息、从NameServer中获取最新的Broker信息,以及将消息发送到Broker。那么在源码中,消息生产者代码都在client包中,因为对于RocketMQ来说,消息生产者就是客户端。而最常用的消息生产者类是DefaultMQProducer:从上图可以了解到DefaultMQProducer的上层的继承体系,其中实现两个核心的接口类。为了对DefaultMQProducer这个消息生产者类有深入的了解,先

2021-09-15 09:19:10 585

原创 RocketMQ源码解析——Broker

目录:RocketMQ源码解析——搭建源码环境RocketMQ源码解析——NameServerRocketMQ源码解析——Broker1. 源码解析:首先找到Broker启动入口:public static void main(String[] args) { start(createBrokerController(args)); // 创建Broker控制器,并启动}创建Broker控制器:可能有人会好奇,为了是创建Broker控制器呢?因为在开发的角度,控制器Con

2021-09-05 21:16:07 451 2

原创 RocketMQ源码解析——NameServer

了解RocketMQ核心组件——NameServerRocketMQ消息中间件的设计思路是基于主题订阅发布的机制,消息生产者(Producer)发送某一个消息到消息服务器,消息服务器负责将消息持久化存储,消息消费者(Consumer)...

2021-08-30 22:53:51 393 1

原创 RocketMQ源码解析——搭建RocketMQ源码环境

本文旨在使用idea从远程仓库中将RocketMQ源码拉取到本地,并配置搭建环境,运行源码中的示例。依赖环境:IdeaJDK8RocketMQ源码(从github或者gitee上拉取代码即可,本文是从gitee上拉取的源码)1. 从远程拉取RocketMQ源码:拉取后的源码目录如下:2. 创建配置文件目录:面对以上的源码目录,代码还不能运行,因为缺少对应的配置文件目录因此,需要完成以下操作:在项目根目录下创建conf目录将distribution/conf目录下的logback_b

2021-08-22 10:48:31 467

原创 SpringBoot整合Shiro框架 && Shiro框架核心源码全面解析

本文主要展示内容有二:SpringBoot项目如何整合Shiro框架,从前端请求用户登录,到后端判断用户、角色、权限认证,再到登录后请求获取用户信息。基于以上整合代码的示例,针对其中shiro框架核心逻辑进行源码解析。在开始阅读文章之前,建议了解Shiro框架的基本使用,才能更好了解本文中所展示的代码示例,可以阅读此文入门:Shiro框架基本使用。首先了解下数据库的表结构这是一个典型的 用户——角色——权限 表结构。用户可以拥有多个角色,角色也可拥有多个权限。SpringBoot项目导入S

2021-06-11 19:30:08 1335

原创 SpringBoot +Shiro(框架介绍 + 使用示例)

Shiro框架介绍Shiro是一个功能强大开源的Java安全框架,提供了用户认证、授权、加密、会话管理、缓存等功能。和目前另一款Java安全框架Spring Security相比,Shiro更加轻便,易于上手。功能点介绍Authentication:用户身份认证/登录,即验证用户是不是合法用户Authorization:用户权限验证,即验证用户是否拥有某个角色,是否拥有某个权限Session Manager:会话管理,即用户登录后就存在一个session,在用户注销前,用户的所有信息都会存在与

2021-06-09 11:40:54 1013 1

原创 Spring + WebSocket(注解) 实现用户一对一通信

首先项目需要导入相应的依赖<dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version></dependency><dependency> <groupId>com.alibaba&l

2021-05-29 11:42:21 488 3

原创 JDK与CGLIB动态代理区别 && 使用示例

JDK与CGLIB动态代理区别:JDK动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。CGLIB动态代理是利用asm开源包,将代理对象类的class进来,通过修改其字节码文件生成子类来处理。对于动态代理来说,Spring框架中使用最为广泛和经典:如果目标对象实现了接口,默认情况下采用JDK的动态代理实现AOP...

2021-05-11 20:12:11 300 4

原创 SpringMVC国际化

This article uses IDEA to realize the internationalization function based on SpringMVC.First create an internationalized properties file:![Insert picture description here https://described] The transfer failed, blog.csdni may have an anti-leech mechanism

2021-05-11 12:41:37 324

原创 支付宝沙箱使用详细教程(Java版本)

想要使用支付宝沙箱,首先需要开通支付宝沙箱的账号:网址:https://open.alipay.com/platform/home.htm进入上面网址点击进入管理中心再点击研发服务然后就可以看到你的沙箱相关的信息:下一步需要点击“设置/查看”设置你的公钥私钥,如下:将“应用私钥”复制保存下来,在Java代码中需要用到,然后再将“应用公钥”复制回填到对应位置。最后再设置下支付宝网关:到此,支付宝的沙箱就开通完成了,接下来就是Java代码的事情了。要使用支付宝沙箱,需要依赖两

2021-05-07 11:28:18 2575

原创 Servlet + Ajax 实现异步上传文件(图片)

Html:<form id="avatarForm" enctype="multipart/form-data" method="post"> <img id="avatar" onclick="chooseAvatar()" title="点击上传头像" class="avatar" src="image/avatar.jpg"> <input id="loadAvatar" name="loadAvatar" type="file"

2021-04-27 15:41:54 778

原创 SpringMVC核心源码解析——从前端请求到后端响应,全过程源码讲解

了解SpringMVC如果你是从事JavaWeb工作的研发工程师,那么对于SpringMVC肯定不会陌生。SpringMVC框架在MVC的基础上进行了封装,很大程度上解放了后端工程师,使得前后端解耦。使用SpringMVC本文的目的是解析SpringMVC中的核心源码,为了方便之后的源码讲解,先来了解SpringMVC的基本使用。项目目录:pom.xml:<dependencies> <dependency> <groupId>org

2021-04-16 22:20:15 2306

原创 servlet实现图片验证码

后端生成图片验证码servlet:@WebServlet("/verify")public class VerificationCodeServlet extends BaseServlet { // 生成图片的宽度 private int width; // 生成图片的高度 private int height; // 验证码中字符的个数 private int codeCount; // 基础码(用于生成随机验证码) priv

2021-04-15 08:41:20 767

原创 LocalDateTime工具类

public class DateTimeUtil { /** * Date转换为LocalDateTime * * @param date 日期 * @return LocalDateTime */ public static LocalDateTime toLocalDateTime(Date date) { return LocalDateTime.ofInstant(date.toInstant(), Zon

2021-04-07 17:50:16 1131 1

原创 基于JDBC封装通用Dao层、数据库连接池类

最近闲来无事,想起一些JavaWeb的开发基础,例如:JDBC、Servlet之类的。因此,基于JDBC的基础上封装了一套通用的Dao层API,如下:项目目录db_config.properties配置文件(数据库连接信息)core_pool_size=1driver_name=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=falseuser=rootp

2021-04-06 19:10:52 827 1

原创 JavaWeb三大组件之一——Servlet源码解析(剖析底层代码,需要耐心看完)

什么是Servlet?Servlet的全程是Server Applet。通俗来说,它是一个请求处理器,它可以接受来自前端或者其他服务器端的请求。作为Java工程师,我们通常是将其用在后端处理前端请求,执行相应业务操作。而在目前市场的常用的主流框架,如Spring、SpringMvc、SpringBoot等等,这些Java应用开发框架中都不见Servlet的踪影,难道Servlet已经没落了吗?当然不是,这些所谓的主流框架,在底层用的其实还是Servlet,只是这些框架已经把Servlet封装隐藏起来了。

2021-03-31 17:42:51 2580 1

原创 JavaWeb三大组件之一——Filter过滤器源码解析(全面手撕Filter源码,需要耐心看完)

什么是Filter?本文所说的Filter是JavaWeb中常见常使用的过滤器。Filter的作用是拦截前端发送给后端的请求,一般是用于权限过滤、日志记录、图片转换、加密、数据压缩等操作。初步了解Filter接口Filter是过滤器的核心接口,其中定义了初始化方法、拦截请求后的要做的具体任务方法、销毁方法。public interface Filter { //初始化方法,整个生命周期中只执行一次。 //在init方法成功(失败如抛异常等)执行完前,不能提供过滤服务。 //

2021-03-30 17:11:48 2983 8

原创 LinkedBlockingQueue源码解析

在Java中有这么一个接口BlockingQueue,它的子类有ArrayBlockingQueue和LinkedBlockingQueue,它们通常被称为阻塞队列。关于阻塞队列,通常是用于解决“生产者——消费者”问题,而在本文中只针对LinkedBlockingQueue的源码进行讲解。本人建议是在阅读本文之前,先了解ArrayBlockingQueue(其中有对阻塞队列更加详细的描述)。LinkedBlockingQueue重要属性// 队列最大容量private final int capac

2021-03-24 20:53:54 1313

原创 ArrayBlockingQueue源码解析

在面试和平常的开发工作中,几乎都会遇到所谓的“生产者——消费者”问题。生产者——消费者在这个问题中需要有两个角色和一个仓库。仓库:用来存储生产者生产出来的产品生产者:生产产品,并将产品存入仓库中消费者:消费产品,从仓库中获取产品进行消费那么针对于这样的场景,如何用Java来实现?首先我们需要考虑的是,供需问题。生产者要一直生产产品吗?当然不是,生产多少产品主要依据是仓库的容量,当仓库爆满就应该停止生产。那消费者要一直消费吗?当然也不是,当前是否能够消费产品,主要依据仓库中是否存

2021-03-24 18:57:50 1461

原创 CopyOnWriteArrayList源码解析

作为Java开发者都应该知道工作中最常用的ArrayList集合是属于线程不安全的。在它的底层源码实现中,没有限制线程的读写操作,因此在多线程的环境下,使用ArrayList是不够合理的。想要线程安全,那么就使用Vector或者Collections工具类中的SynchronizedList吧。但是对于这两种集合来说,它的线程安全效果的底层实现是直接使用synchronize关键字修饰方法,也就是对整个集合上了锁,同一个时刻只能有一个线程方法访问集合。毫无疑问,效率太低,得不偿失。针对于以上的问题,Co

2021-03-24 14:51:38 1458 1

原创 ThreadLocal源码解析

ThreadLocal是什么?在Java体系中有一个ThreadLocal类,它用于提供线程内部的局部变量,这些变量与它们的正常对象不同,每个线程拥有一个单独属于自己的,独立的变量的初始副本。简单来说,通过ThreadLocal可以实现多线程中数据隔离效果。ThreadLocal如何使用?通过ThreadLocal的简单使用,来验证数据隔离效果:public class Main { public static void main(String[] args) {

2021-03-24 10:11:38 1458 1

原创 HashMap源码解析

想要了解HashMap集合,先来了解其中的哈希值计算原理为何哈希?Hash也称散列、哈希,其中基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出。这个映射的规则就是对应的Hash算法,而这个输入出后的固定长度的结果(二进制串)就是哈希值。但是由于通过Hash算法产生的哈希值是有限的,而存储的数据可以说是无限的。这样就可能会导致存储的数据不同,而两者产生的哈希值却相同,此情况称为哈希冲突。HashMap的如何解决哈希冲突?为了更好的解决这个问题,我们先来了解HashMap类中的基本信息属

2021-03-19 19:18:42 1396

原创 LinkedList源码解析

LinkedList集合是平时工作中常用的集合之一,它的增删操作效率高,但是相对它的查询效率就不如ArrayList集合了。对于想要了解ArrayList集合的朋友可以看我另外一篇博客ArrayList源码解析,本文只针对LinkedList集合的源码讲解分析。LinkedList的基本信息属性// 列表中的元素个数transient int size = 0;// 列表中第一个元素transient Node<E> first;// 列表中最后一个元素transient No

2021-03-18 19:53:37 1424

原创 ArrayList源码解析

在日常的研发工作和个人项目中,ArrayList可以说是Java中最为常用的集合之一。同时作为Java研发工程师,不能仅仅满足于表面使用,对其中实现的逻辑和源码也需要有一定的了解。ArrayList的基本信息属性// 列表初始默认容量private static final int DEFAULT_CAPACITY = 10;// 存放元素的数组(由此可知,ArrayList的底层实现依赖的是数组)transient Object[] elementData;// 列表中元素的个数priv

2021-03-18 15:51:12 1289

原创 Java线程池ThreadPoolExecutor源码解析

Java中的线程池相信大家都很熟悉,不熟悉的朋友可以看我的另一篇博文Java线程池类型以及execute和submit方法的区别。本文主要针对线程池核心类ThreadPoolExecutor中的常用重要方法进行源码解析。ThreadPoolExecutor中代表线程池状态的属性private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));private static final int COUNT_BITS = Integ

2021-03-17 21:01:21 1526 2

原创 AbstractQueuedSynchronizer(AQS)源码分析——Condition条件队列

Condition条件队列是为了实现线程之间相互等待的问题。注意Condition对象只能在独占锁中才能使用。举个例子:有两个线程,生产者线程,消费者线程。当消费者线程消费产品时,发现没有产品,这时它就要等待,让生产者线程生产产品出来后,再通知它消费。同样的,当生产者线程生产产品时,发现存储产品的仓库(列表)容量已经满了,这时它就要等待,让消费者消费产品后,再通知它生产产品。因为操作的是同一个资源,所以要加锁,防止多线程冲突。而锁在同一时间只能有一个线程持有,所以消费者/生产者在让线程等待前,必须释放

2021-03-16 10:21:39 1593 1

原创 AbstractQueuedSynchronizer(AQS)源码分析——共享锁(ReentrantReadWriteLock)

Java中的AQS实现了多线程中很重要的两套机制——独占锁和共享锁。在此文中只针对共享锁的源码进行讲解分析。如果想了解独占锁的朋友可以看我的另外一篇博文:https://blog.csdn.net/weixin_41083377/article/details/114753584共享锁是什么?简单来说,共享锁可以被多个线程共同持有。在Java中最经典的实现就是ReentrantReadWriteLock(读写锁)。在读写锁中有两个锁对象,一个是读锁,另一个是写锁。读锁属于共享锁,可以让多个线程同时

2021-03-15 17:24:35 1503 1

原创 AbstractQueuedSynchronizer(AQS)源码分析——独占锁(ReentrantLock)

AQS是什么?AQS是Java中实现阻塞和唤醒线程的最基础类。全称 AbstractQueuedSynchronizer(同步队列),它是一个同步工具也是 Lock 用来实现线程同步的核心组件。而其中也是基于CAS原理比较替换实现添加和移除结点。从使用层面来说,AQS 的功能分为两种:独占锁:每次只能有一个线程持有锁,比如ReentrantLock就是以独占方式实现的互斥锁。共享锁:允许多个线程同时获取锁,并发访问共享资源,比如ReentrantReadWriteLock读写锁PS:本

2021-03-13 20:33:35 1541

原创 ReentrantLock锁的可重入原理以及源码分析

了解Java中ReentrantLock可重入锁的人都知道可重入的原理:针对于同一线程而言,其中执行的嵌套同步方法只需获取一次锁,便可执行到底。来个例子说明:在t线程中有两个同步方法A、B,而方法A中,调用了方法B。那么执行方法A的时候便获取到了锁对象,当执行到方法B中需要获取锁的时候,因为方法A、B处于同一个线程当中,而且使用的是可重入锁机制,所以方法B无须再次获取锁便可以继续执行之后的代码。如果采用的是不可重入锁机制,那么当执行到方法B时候,就会和方法A争抢锁,而锁已被方法A获取。方法A当中需

2021-03-13 11:06:16 1911 2

原创 Java线程池类型以及execute和submit方法的区别

为什么要使用线程池如果有非常的多的任务需要多线程来完成,且每个线程执行时间不会太长,这样频繁的创建和销毁线程,让效率降低。有了线程池就不用创建更多的线程来完成任务,因为线程可以重用。线程池维护一个队列,队列中保存着处于等待(空闲)状态的线程。不用每次都创建新的线程。Java中有四种类型的线程newFixedThreadPool:创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。newCached

2021-03-10 10:07:38 1792

原创 详解Java线程中的join()方法

对于Java中的join()方法的描述,我们首先来看下源码当中的解释从源码当中的描述,我们只能知道join方法的作用是让线程陷入等待。其中可以传递以毫秒为单位的等待时间参数,如果传递参数为0,则线程会一直等待。其实对于join方法,网上有很多解释,大都是只说如何使用,并没有对join当中的实现进行分析。因此,在此结合网上的各种说法,对线程中的join方法进行源码分析,同时也记录自己的学习过程。首先先来了解join方法如何使用,以及它的作用。为了更有对比性的展示,首先来个简单并正常使用(不使

2021-03-09 20:55:46 4819 13

原创 JVM内存分配概述(堆、栈、方法区)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2021-03-05 18:11:32 1788 3

空空如也

空空如也

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

TA关注的人

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