自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Mybatis(六): 缓存模块详解

Mybatis(六): 缓存模块详解文章目录Mybatis(六): 缓存模块详解1 模块结构2 `Cache`和`PerpetualCache`3 装饰器3.1 `BlockingCache`3.2 `FifoCache`3.3 `LruCache`3.4 `LoggingCache`3.5 `ScheduledCache`3.6 `SerializedCache`3.7 `SoftCache`和`WeakCache`3.8 `SynchronizedCache`4 `CacheKey`5 `Mybat

2021-09-15 13:06:30 481

原创 Mybatis(五): binding模块详解

Mybatis(五): binding模块详解文章目录Mybatis(五): binding模块详解1 `MapperRegistry`1.1 `addMapper()`方法1.2 `getMapper()`方法2 `MapperProxyFactory`3 `MapperProxy`4 `MapperMethod`4.1 `SqlCommand`4.2 `MethodSignature`4.2.1 `ParamNameResolver`4.3 `excute()`方法3 总结今天这是学习Mybati

2021-09-12 13:00:01 580

原创 Semaphore基本使用及原理

Semaphore基本使用及原理文章目录Semaphore基本使用及原理1 什么是Semaphore2 基本使用3 源码分析3.1 构造方法3.2 获取许可3.2.1 `tryAcquire`方法3.2.2 `acquire`方法3.3 释放许可4 总结在前面的文章中我们学习了AQS、ReentrantLock和CountDownLatch的原理。在今天的文章中我们再学习一个JUC下的工具类-Semaphore。今天的文章中我们会先介绍下Semaphore的使用,然后通过源码来学习下其是如何实现的。

2021-09-09 17:54:06 734

原创 Mybatis(四): 类型转换器模块详解

文章目录`Mybatis(四): 类型转换器模块详解`1 `TypeHandler`2 `BaseTypeHandler`3 自定义类型转换器3.1 功能介绍3.2 编写类型转换器3.3 实体及Mapper如下3.3 配置文件3.4 测试4 `TypeHandlerRegistry`4.1 注册类型转换器4.2 查找类型转换器4.2.1 通过类型转换器类型查找4.2.2 通过`JdbcType`查找4.2.3 通过`Java`类型查找5 `TypeAliasRegistry`5.1 注册别名5.2 通过别.

2021-09-01 16:00:26 561

原创 Mybatis(三):架构及解析器模块详解

Mybatis(三):架构及解析器模块详解文章目录Mybatis(三):架构及解析器模块详解1 架构2 解析器模块2.1 XPathParser2.1.1 构造方法2.1.2 解析方法2.2 占位符处理2.3 XNode3 总结在前面的文章中我们了解了Mybatis的基本使用及其执行流程。相信你已经对Mybatis有了简单的了解。今天我们正式进去源码学习阶段,在这篇文章中,我们首先介绍下Mybatis的结构,之后再学习下解析器模块的内容。首先自行去github上下载其源码,地址为:https://

2021-08-30 17:36:26 599

原创 Mybatis(二):执行流程

Mybatis(二):执行流程文章目录Mybatis(二):执行流程1 Resources加载配置文件2 SqlSessionFactory的创建流程2.1 XMLConfigBuilder创建过程2.1.1 Configuration的创建2.2 配置文件的解析2.2.1 标签的解析2.3 创建SqlSessionFactory对象3 SqlSession的创建流程4 Mapper的创建流程5 方法执行6 总结在上篇文章中,我们介绍了Mybatis的基本使用,如果大家想要学习Mybatis的配置及高

2021-08-30 17:32:31 385

原创 Mybatis(一):基本使用

Mybatis(一):基本使用一 前言Mybatis是我们常用的一个持久层框架,他支持自定义SQL、存储过程以及高级映射。Mybatis封装了JDBC的一些逻辑,简化了我们的开发。本篇文章是Mybatis的第一篇文章,在本文中我们主要介绍下Mybatis的基础知识,包括Mybatis的单独使用、Spring集成及Spring Boot中使用。本篇文章中涉及的示例代码我会提交到github上,地址会在文末给出,需要的可以自行去下载。示例中使用的依赖版本如下:JDK

2021-08-30 17:31:09 328

原创 CountDownLatch使用及实现原理

CountDownLatch使用及实现原理在前面的文章中我们了解了,AQS和ReentrantLock的实现原理。在本篇文章中我们介绍Java中的另一个同步工具CountDownLatch。CountDownLatch也是一个比较常用的同步工具,其也是在AQS的基础上实现的。1 基本使用CountDownLatch是也是Java中一个比较重要的同步工具,当我们希望主线程等待多条子线程逻辑处理完后再往下执行时我们可以使用这个工具类,其基本使用如下:/** * Create By IntelliJ

2021-08-30 17:29:00 529

原创 ReentrantLock实现原理

ReentrantLock实现原理在上篇文章中我们结合源码介绍了AQS的数据结构及实现原理,在今天的文章中我们介绍下ReentrantLock的实现原理,也看看在ReentrantLock中是如何使用AQS的。ReentrantLock是一个Java层面的锁的实现,也是我们常用的一个锁对象,是一个可重入的排他锁。1 类结构ReentrantLock是Lock的一个实现类,实现了Lock中定义的锁应该具备的功能。其类图如下:通过源码我们看到,在ReentrantLock中只有一个Sync类型的变量

2021-08-30 17:27:30 450

原创 AbstractQueuedSynchronizer源码解析

AbstractQueuedSynchronizer源码AbstractQueuedSynchronizer通常简称AQS,他是java.util.locks包下的一个类,Java中的很多类都是通过改类实现的。在本文中我们通过阅读源码的方式查看下其实现原理,使用的JDK版本为1.8.1、类结构与数据结构1.1 类继承关系AbstractQueuedSynchronizer继承AbstractOwnableSynchronizer,AbstractOwnableSynchronizer的定义是比.

2021-08-30 17:24:09 577

原创 Sentinel整合Spring Cloud Gateway使用Nacos实现动态限流

一、前言Sentinel支持对Spring Cloud Gateway和Zuul等主流的API Gateway进行限流,Sentinel的限流规则默认是存储在内存中的,随着项目的重启我们在项目运行期间配置的限流规则也就丢失了,这在生产环境是不被允许的。Sentinel提供了对Zookeeper、Redis、Nacos、Apollo等数据源的支持。本文的内容是介绍Spring Cloud Gateway集成Sentinel和Nacos实现网关的动态限流。如果想系统学习其知识的请查看对应的文档,链接如下:.

2020-09-09 10:25:56 3119 1

原创 ElasticSearch安装及Java客户端使用

下载地址:https://www.elastic.co/cn/downloads/elasticsearch摘要本文的主要内容是介绍ElasticSearch和

2020-04-10 20:13:16 750

原创 Centos7上防火墙相关操作命令

防火墙状态查看systemctl status firewalld.service启动防火墙systemctl start firewalld.service关闭防火墙systemctl stop firewalld.service开放某个端口firewall-cmd --zone=public --add-port 80/tcp --permanent删除某个开放端口fire...

2019-12-13 18:48:51 176

原创 Centos7上GitLab的安装和卸载

1 安装安装所需的依赖yum -y install policycoreutils openssh-server openssh-clients postfix下载对应的安装包,在https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/进行查找https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce...

2019-12-09 14:22:11 471

原创 Mysql 5.7root账号密码修改

Mysql在Mac上的默认安装路径为/usr/local/mysql,忘记root账号密码可以通过如下方式进行修改关闭mysql服务 执行/usr/local/mysql/support-profiles/mysql-server stop命令或者从系统偏好设置中关闭关闭mysql的密码校验 进入bin目录执行./mysqld_safe --skip-grant-tables命令新起一个终...

2019-12-04 22:11:50 207

原创 Java书籍推荐

在平常的学习中,自己也看了很多技术相关的书籍,感觉对自己的帮助还是挺大的,最近将其整理汇总一下,希望能够帮助到在寻找相关书籍的同学。1 《深入理解Java虚拟机 JVM高级特性与最佳实践》第2版很不错的一本讲解Java虚拟机的书籍,反反复复看过多遍。2、《Java程序性能优化》想学习JVM调优相关知识的可以查看。3、《Java并发编程的艺术》4、《MySQL技术内幕 Inno...

2019-11-15 11:02:16 168

原创 ConcurrentHashMap源码分析

​1、前言我们知道HashMap是一个线程不安全的集合类,在多线程中我们是不能使用的,HashTable虽然是线程安全的,但是通过同步方法来实现的,那在JDK中是否存在性能好的Map集合呢?答案是存在的,这便是我们今天所要讲解的ConcurrentHashMap。本文参考的是JAVA 8。2、数据结构ConcurrentHashMap的底层使用的数据结构同HashMap一样,均是数组+链表+...

2019-11-11 16:44:57 198

原创 vim快捷键汇总

《vim使用技巧》链接:https://pan.baidu.com/s/17qUtw1grLzSohyt5JLOpNA 密码:spzf

2019-10-27 00:28:33 199

原创 Redis总结

Redis官网Redis命令参考Redis源码Git地址Redis版本 5.0.4文章目录1 前言2 Redis基础2.1 Redis的安装2.2 通用命令2.3 数据类型及实现原理2.3.1 String 字符串2.3.2 hash 哈希2.3.3 List 列表2.3.4 set 集合2.3.5 zset 有序集合2.4 Java客户端3 Redis原理1 前言Redis...

2019-10-25 17:42:00 1082

原创 Java运行数据区及内存分配策略

Java8虚拟机规范《深入理解Java虚拟机_JVM高级特性与最佳实践》(第二版)链接:https://pan.baidu.com/s/1RQ1Rtsq3tfb2ZesbXy8FCg 密码:4tjn文章目录1 什么是Java运行数据区2 Java 8中的运行时数据区2.1 程序计数器2.2 Java 虚拟机栈2.3 本地方法栈2.4 堆2.4.1 常用的虚拟机参数2.5 方法区2.5...

2019-10-14 17:23:31 443

原创 实用的JVM及内存分配参数

1 内存分配-Xmx 设置最大堆内存-Xms 设置最小堆内存-Xmn 设置新生代大小 一般设置为整个堆内存的1/4到1/3 会设置相同的-XX:NewSize和-XX:MaxNewSize-XX:MaxPermSize 设置永久代大小-Xss 设置线程栈大小-XX:SurvivorRatio 设置eden区和survivor区的比例,默认为8-XX:NewRatio 设置新生代...

2019-09-27 12:12:19 305

原创 JDK监控和故障处理工具

jpsjstatjinfojmp

2019-09-26 21:09:25 479

原创 LeetCode第四题----寻找两个有序数组的中位数

在解题之前应该先了解什么是中位数在一个有序数组中,如果数组长度为奇数,那么中位数是数组中间位置的元素;如果数组长度为偶数,那么中位数是中间两个元素的平均值题目给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:num...

2019-09-26 12:10:23 233

原创 Spring自定义标签使用及加载过程

Spring版本为5.0.2.RELEASE前面咱们已经介绍过了Spring IOC初始化的文章中,我们已经介绍了IOC初始化的源码,其中在标签解析的源码中,有一个是Spring默认标签的解析方法,还有一个自定义标签的解析,在DefaultBeanDefinitionDocumentReader.parseBeanDefinitions方法中,如果不是Spring的默认标签会调用parseC...

2019-09-19 11:16:49 333

原创 Spring Cloud Eureka使用

相关版本介绍JDK : 1.8Spring Boot : 2.1.6.RELEASESpring Cloud : Greenwich.SR2在微服务架构中,服务注册与发现是一个重要的工作,其实现的类型有很多种,例如:Eureka、Zookeeper、Consul、Nacos。本文就简单介绍下Eureka作为注册中心的服务端和客户端的使用。1、Eureka Server使用1....

2019-09-11 14:02:56 170

原创 SpringMVC工作原理

SpringMVC是我们使用的比较多的一个框架,相信进行Java web编程的都非常熟悉,最近在学习其源码,做此笔记也加深个人印象。主要内容包括如下几方面:基本使用执行流程及核心组件常用注解源码分析1 基本使用我们可以使用SpringBoot很快的创建一个web应用:创建Maven项目,引入依赖 <parent> <groupId&...

2019-09-09 22:48:35 160

原创 Spring核心原理----IOC容器源码分析

本文参照的Spring版本为5.0.2.RELEASEIOC(Inversion of Control)即所谓的控制反转,是指把之前需要我们在代码中手动创建对象的过程交由容器帮我们完成。在Spring中,Spring IOC提供了一个基本的JavaBean容器,通过IOC模式管理依赖关系,并通过依赖注入和AOP切面为对象赋予了事务管理、生命周期管理等功能。我们只需要在配置文件中描述对象之间的...

2019-09-05 17:18:57 200

原创 《深入理解Java虚拟机》学习笔记-----------GC

在Java中,内存的分配及回收是由虚拟机来完成的,是不需要程序员手动进行处理的。但这并不表示我们可以不用对其进行了解。当需要排查各种内存溢出、泄露问题,当垃圾收集成为系统的瓶颈时,我们就需要对其进行问题的排查及定位。我们从以下几个方面来了解Java的垃圾回收需要回收的对象垃圾回收算法垃圾回收器1 需要回收的对象在进行内存回收钱首先需要定位需要回收的对象,在Java语言中主要使用的是...

2019-09-03 18:50:48 145

原创 Java中的原子类

在java.util.concurrent.atomic包中提供了一些原子操作类,使用它们可以完成对基本类型、数组类型、引用类型和字段值的原子更新,我们可以在不同的场景使用不同的原子类,如下:AtomicIntegerAtomicBooleanAtomicLongAtomicIntegerArrayAtomicLongArrayAtomicReferenceArrayAtomicI...

2019-08-22 15:46:13 579

原创 Java中的线程池

线程池是平常运用较多的一个并发框架,提前创造好一批线程放入容器中,在使用时,从容器中获取线程,使用完再放回容器中,而不是为每次的使用都创建一个新的线程。线程池的使用会带来如下的好处:降低资源消耗,避免了线程的创建和销毁提高响应速度,不需要等待线程的创建便于对线程进行管理为了更好的使用线程池,我们应当对其原理进行了解。1 线程池的使用在学习其实现原理时,先通过一个简单的实例来了解如何...

2019-08-14 20:28:30 129

原创 InnoDB下的索引总结

1 InnoDB的表在InnoDB存储引擎中,每张表都有个主键,如果在创建表时没有显示的指定主键,那么InnoDB会自动创建一个主键,其规则如下:如果存在非空的唯一索引,则该列为主键(存在多个,选择第一个定义索引的列)若不存在,InnoDB存储引擎会自动创建一个6字节大小的指针为主键2 索引数据实现索引的实现方式有哈希和B+树两种结构。InnoDB存储引擎同时支持这两种索引,但其支...

2019-08-13 19:02:58 165

原创 《深入理解Java虚拟机》学习笔记---------------类加载过程

1 类的生命周期类的生命周期是指其被加载到虚拟机内存中开始,到卸载出内存为止。在类的整个生命周期中包含如下7个阶段:加载Loading验证Verification准备 Preparation解析 Resolution初始化 Initialization使用 Using卸载 Unloading验证、准备和解析三个阶段统称为连接加载、验证、准备、...

2019-08-01 12:23:43 157

原创 HashMap源码分析

一、前言HashMap是常用的一个存储键值对的类。本文通过分析其源码来了解其的实现原理,本文的源码是基于JDK1.8。二、HashMap数据结构HashMap的底层数据结构是数组+但向链表+红黑树来实现的,上面是一个Node数组,当发生hash碰撞时会在链表下方插入一个新的节点,当节点数量超过一定的数量后,链表会转换为红黑树。其示例图如下:可以通过其源码找到改数据类型的定义:static...

2019-06-21 15:40:13 144

原创 ReentrantLock源码分析

保证多线程安全的方式处synchronized关键字同步外,常用的还用使用加锁的方式,及Lock的使用,ReenTrantLock是常用的一个加锁类,它的使用比synchronized的使用更加灵活,接下来我们就通过其的加锁(lock())和释放锁(unlock())方法为入口来查看其工作原理。一、类图在其中有一个继承AbstractQueuedSynchronizer(简称AQS,同步队列,...

2019-06-19 19:09:59 200

原创 synchronized原理

一、前言synchronized是JAVA提供的一个关键字,起作用是对方法进行枷锁,保证在多线程操作共享变量的安全性。在Java 1.6对其进行了优化,引入了偏向锁和轻量级锁,使得在一些情况下并不是重量级锁。用法如下,不同的用法所对应的锁粒度也不相同:修饰实例方法 锁为当前对象修饰静态方法 锁为类修饰代码块 锁为传递的对象锁的状态有如下几种:无锁偏向所轻量级锁重量级锁...

2019-06-19 18:52:48 118

空空如也

空空如也

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

TA关注的人

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