自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 spring中@Validated注解的使用

一、背景日常开发过程中,经常遇到大量的参数进行校验,在业务中还要抛出异常等校验信息,在代码中相当冗长, 充满了if-else这种校验代码,代码不够优雅,使用spring的javax.validation注解式参数校验,可以免去繁琐的校验。二、@Validated注解单层对象的实体类@Data@AllArgsConstructor@NoArgsConstructor@Builderpublic class Person { @NotNull(message = "id添加时可以为空,

2021-06-10 20:13:06 16878

原创 ConcurrentHashMap源码解析

源码解读1.7底层实现原理Segment对象继承ReentrantLock重入锁 static final class Segment<K,V> extends ReentrantLock implements Serializable { private static final long serialVersionUID = 2249069246763182397L; static final int MAX_SCAN_RETRIES =

2021-03-15 08:15:08 163

原创 HashMap面试题

1.重写equals和hashCoe的原因hashcode方法:底层是采用c语言编写的,根据对象的内存地址转换成整数类型。定律:如果两个对象的hashcode值相等的情况下,对象的内容值不一定相等,hash碰撞问题。如果使用equals方法比较两个对象内容值相等的情况下,则两个对象的HashCode值相等。注意:equals方法默认的情况下Object类中采用==比较对象的内存地址值是否相等,只要覆写equals,就必须覆写hashcode如果自定义对象作为Map的键,那么必须覆写has

2021-03-12 22:54:03 229

原创 Java中的移位运算

概要当原码为正数的时候,正数的原码反码补码都相同,即00011的反码也为00011,补码也为00011.当原码为负数的时候,反码即按位取反,补码为反码加一,计算机存储的都是补码,最高位表示为符号位,1表示为负数,0表示为正数。<<表示左移运算符左移不区分有符号和无符号, 都是左移之后右边补上0, 最左边的符号位也直接移走。10<<2的过程0000 0000 0000 0000 0000 0000 0000 1010--原码0000 0000 0000 0000 0000

2021-03-10 10:39:55 141

原创 Java整合Protobuf的使用

一、先编写对应的protobuf文件syntax = "proto3";import "google/protobuf/wrappers.proto";option java_package = "com.qw.ad.controller.rta.proto";option java_outer_classname = "RtaApi";enum PlatformType { PLATFORM_UNKNOWN = 0; ANDROID = 1; IOS = 2;}en

2020-11-03 15:01:02 1033

原创 代码整洁之道

函数不要在函数中传入布尔值参数,可以把需要传入布尔值的函数拆成两个函数来处理抽离Try/Catch,把try和catch代码块的主体部分抽离出来,另外形成函数注释一般通过创建一个描述与注释所言同一事物的函数就可以去掉注释...

2020-10-21 23:57:00 190

原创 JVM垃圾回收

如何判断对象可回收引用计数法概念:当垃圾回收机制在回收垃圾的时候,对象如果被引用的情况下,对象引用次数就会加1,如果该对象没有被引用的情况下则引用次数就会减1,如果该对象引用次数为0的情况下,则认为该对象是可回收对象缺陷:引用计数法在java虚拟机没有被使用过,存在循环引用的问题,比如A依赖B,B依赖A,A和B的引用次数都是为1,这时候没有其他的对象依赖于A和B,引用计数法永远不会回收A和B对象。可达性分析算法通过一系列的称为”GC Roots“的对象作为起始点,从这些节点开始向下搜索,搜索所走过

2020-09-09 11:26:32 354

原创 互联网安全架构设计

如何防御xss攻击过滤器过滤请求的过程:过滤器先执行→SpringMVC拦截器使用MD5防止参数被篡改对称和非对称加密对称加密加密和解密都是同一个密钥优点:算法公开、加密快、效率高缺点:只有一把密钥,不是很安全常用的算法:DES和AES非对称加密公钥和私钥互换,生成一对秘钥对,分别为公钥和私钥。公钥加密,必须私钥解密私钥加密,必须公钥解密所以在很多支付接口中为了保证安全性,客户端采用公钥加密,服务器端采用私钥解密,就算别人客户端的公钥,也无法解密,因为解密数据必须要私钥,而

2020-08-18 22:51:38 151

原创 JVM内存结构

JVM内存区域分配堆Java堆是各线程共享的内存区域,在jvm启动时创建,这块区域时jvm中最大的,用于存储应用的对象和数组,也是GC主要的回收区,一个jvm实例只存在一个堆内存,堆内存是可以调节的,类加载器读取类文件后,需要把类、方法、常量放到堆内存中,以方便执行器执行,堆内存分为三部分:新生代、老年代、永久代。栈Java线程栈私有的,是在线程创建时创建,它的生命周期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over,生命周期和线程一致,基本类型

2020-08-17 22:42:47 109

原创 ClassLoad类加载器

什么是类加载器将我们class文件读取到内存中。Class文件读取来源本地磁盘文件java代码变为的class文件通过网络下载的class文件War、jar解压的class文件从专门的数据库中读取的class文件使用javacglib、动态代理生成的代理类class文件类加载器加载的过程...

2020-08-13 16:49:04 198

原创 ThreadLocal

Threadlocal的概念Threadlocal提供了线程本地变量,它可以保证访问到的变量属于当前线程,每个线程都保存有一个变量副本,每个线程的变量都不同,Threadlocal提供了一种线程隔离,将变量与线程绑定Threadlocal适用于多线程的情况下,可以实现传递数据,实现线程隔离...

2020-07-29 00:23:51 147

原创 FutureTask原理和手写

简单用法实现 Callable 接口,核心是get()方法会调用 LockSupport的park和unpark方法,让线程阻塞,直到拿到响应的结果package com.mayikt;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/** * @Description: * @Author:

2020-07-28 07:36:21 120

原创 线程池源码深度解析

为什么要使用线程池因为频繁的开启线程或者停止,线程需要重新被cpu从就绪状态到调度,效率非常低,所以使用线程池可以实现复用,从而提高效率。线程池的作用1.降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。2.提高响应速度:任务到达时,无需等待线程创建即可立即执行。3.提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。4.提供更多更强大的功能:线程

2020-07-27 22:53:30 310

原创 Condition、CountDownLatch、Semaphore源码分析

基本概念Condition是一个接口,提供了两个核心方法,await()和signal方法,分别对应着object的wait和notify方法,调用Object对象的这两个方法,需要在同步代码块里面,必须获取到锁才能执行这两个方法,同理,Condition调用这两个方法,也必须先获取到锁等待队列:用于存放lock锁中调用await方法,当前线程会变为阻塞状态,同时会释放锁,单向链表存放同步队列:用于存放没有竞争到锁,采用双向链表存放使用package com.mayikt;import j

2020-07-26 20:04:23 308

原创 深入分析AQS实现原理

AQS基本的概念AQS的全称是AbstractQueuedSynchronizer是一个抽象同步队列,它提供了FIFO队列,是一个用来实现同步锁以及其他涉及到同步功能的核心组件,常见的有:ReetrantLock、CountDownLatch等AQS是一个抽象类,主要是通过继承的方式来使用,它本身没有实现任何的同步接口,仅仅是定义了同步状态的获取以及释放的方法来提供自定义的同步组件lock与synchronized区别Lock基于AQS封装的锁,结合CAS实现Synchronized是基于C++虚

2020-07-26 15:31:24 348

原创 Synchronized关键字深度解析

Synchronized的原理monitorenter每一个对象都会和一个监视器monitor关联,监视器被占用时会被锁住,其他线程无法来获取到该monitor,当JVM执行某个线程的某个方法内部的monitorenter时,它会尝试去获取当前对象的monitor的所有权。过程如下:若monitor的进入数为0,线程可以进入monitor,并将monitor的进入数置为1,当前线程成为monitor的owner若线程已拥有monitor的所有权,允许它重入monitor,则进入monitor的进

2020-07-25 14:08:52 159

原创 锁的概述

悲观锁悲观锁比较悲观,当多个线程对共享数据实现修改的时候,谁能拿到锁,谁就能修改成功,最后只有一个线程才能修改成功,

2020-07-23 08:20:52 118

原创 volatile关键字深度解析

volatile作用能够保证线程可见性,当一个线程修改共享变量时,能够保证对另一个线程可见性,但是不能够保证共享变量的原子性问题volatile的特性可见性:能够保证线程可见性,当一个线程修改共享变量时,能够保证对另外一个线程可见性。顺序性:程序执行程序按照先后顺序执行,禁止重排序原子性:原子性在一个操作是不可中断的,要么全部执行成功要么全部执行失败,有着“同生共死”的感觉。即在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程所干扰代码例子package com.mayikt;/

2020-07-20 00:06:22 205

原创 多线程之间wait、notify、join用法

Wait、Notify()用法两个方法都属于Object类中的,使用过程中涉及到对象锁,必须放在synchronized中使用wait会暂停当前的线程,线程变为阻塞状态,释放cpu执行资格,同时释放锁Notify唤醒锁池正在等待的线程代码例子package com.mayikt;/*** @Description:* @Author: ChenYi* @Date: 2020/07/19 09:18**/public class Thread007 { class Res

2020-07-19 10:49:12 789

原创 多线程的安全问题及解决方案

概念当多个线程同时共享同一个全局变量做写的操作的时候,可能会受到其他线程的干扰,就会产生线程安全问题,出现数据脏读解决方案核心思想:同一个时刻保证只允许单线程执行方案使用java锁的机制Synchronized、Lock锁和CAS无锁机制对于代码中如果在多线程同时执行操作的情况下,可能会受到其他线程的干扰的代码采用锁的机制,在同一个时刻只能保证只有一个线程去执行,只有获取到锁之后,才能够进入该代码块执行,代码执行完之后释放锁之后其他线程去获取锁才可以执行。没有获取到锁的线程,则一直会排队阻塞

2020-07-18 16:58:22 1485

原创 多线程的入门基础

多线程的基本概念进程进程就是系统中正在运行的一个程序,程序一旦运行就是一个进程,在一个进程中可以开启多个不同的线程执行线程在同一个进程开启了多条不同的执行路径,每条执行路径就是一个线程,多条不同路径同时执行,进程是线程的集合多线程的好处使用多线程可以提高程序效率快速响应给客户端,给用户更好的体验每个线程之间相互不影响多线程的应用场景一些比较耗时的业务逻辑采用多线程处理线程上下文切换对于单核CPU来说,CPU在同一个时刻只能运行一个线程,当正在运行的线程切换到另外一个线程时,这个

2020-07-18 11:26:52 152

原创 SpringBoot执行流程解析

核心理念能够帮助开发者快速的整合第三方框架原理:maven依赖整合和自定义starter完全去除xml配置,采用注解形式原理:SpringBoot根据spring体系原生的注解实现包装不需要外部容器,内嵌入服务器原理:Java语言支持创建Tomcat服务器...

2020-07-18 00:03:53 1116

原创 SpringMVC的源码深度解析

ServletContainerInitializer接口在web容器启动时提供给第三方做一些初始化的工作的接口,例如servlet或者filtes等,每个框架要使用ServletContainerInitializer就必须在对应的jar包创建META-INF/service目录,并且建javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类。@HandlesTypes(value = My

2020-07-15 16:43:34 371

原创 Spring的循环依赖问题解决

概念Spring容器循环依赖问题单例情况下,spring容器中默认是利用三级缓存解决好循环依赖的问题的,多例的情况下是没有解决的,因为设置注入的多例对象不明确,就会产生循环依赖问题。三级缓存三级缓存关键代码,从三级缓存中获取对象 protected Object getSingleton(String beanName, boolean allowEarlyReference) { //从一级缓存中查询是否存在该对象 查询完整的对象 Object singletonObject = th

2020-07-09 10:14:13 214

原创 Spring声明式事务源码深度解析

整体流程开启@EnableTransactionManagement注解引入TransactionManagementConfigurationSelector.class这个类加载AutoProxyRegistrar.class,ProxyTransactionManagementConfiguration.class两个对象注册 InfrastructureAdvisorAutoProxyCreator.class这个对象,它是BeanPostProcessor的子类,beanid是org.s

2020-07-08 08:15:31 256

原创 SpringAop深度解析

Aop的基本概念Aop面向切面编程,在方法之前和之后实现处理 应用场景在于:日志打印、事务实现、安全等。下面展示五个通知的例子。注意:ProceedingJoinPoint只能在环绕通知中拿到,其他的通知拿不到的,其他通知拿的是JoinPointpackage com.mayikt.aspect;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.l

2020-07-07 21:28:31 106

原创 SpringBean的生命周期深度解析

单例和多例单例默认在容器创建的时候就会初始化,容器关闭的时候销毁多例在使用对象的时候才会初始化生命周期调用无参构建函数创建对象—对象初始化—对象销毁对象的初始化和销毁过程自定义对象的初始化操作和对象销毁的操作,单例的销毁是在容器关闭的时候才会把对象销毁下面展示第一种使用@Bean注解指定初始和销毁方法代码。package com.mayikt.v4.entity;/** * @Description: * @Author: ChenYi * @Date: 2020/07/03

2020-07-05 07:48:24 161

原创 Spring中的AnnotationConfigApplicationContex深度解析

BeanFactory和ApplicationContext的作用和区别BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关心,负责bean的生命周期ApplicationContext继承BeanFactory,除了BeanFactory所提供的功能之外,还提供了更完整的框架功能AnnotationConfigApplicationContexAnnotationConfigApplicationContex的类图基于注解package c

2020-07-04 13:29:16 590

原创 Spring5.0常用的注解解析

@Configuration表示该类为配置类,相当于Spring的xml配置文件,然后会在该类中注入一些bean对象,项目中一般注入的是第三方的依赖对象,通常会结合@ComponentScan注解一起使用,扫包范围的包package com.mayikt.v2.config;import com.mayikt.v1.entity.UserEntity;import org.springframework.context.annotation.Bean;import org.springframe

2020-07-03 13:37:42 398

原创 Mybatis源码深度解析

Mybatis大体架构流程分析1.读取resource下面的mybatis配置文件获取输入流Reader对象 //获取mybatis配置文件 String configName = "mybatis_config.xml"; //获取输入流 Reader reader = Resources.getResourceAsReader(configName);2. 获取SqlSessionFactory对象 SqlSessionFactory sqlSessionFact

2020-07-01 16:20:00 6996

原创 Map源码深度解析

前言map集合是key value的集合HashMap与HashTable的区别hashMap是线程不安全的,HashTable是加了synchronized锁,线程安全的,效率比较低手写HashMap自定义Map接口package com.mayikt.ext;/** * @Description: 自定义Map接口 * @Author: ChenYi * @Date: 2020/06/20 11:19 **/public interface MayiktMap<K, V

2020-06-25 09:57:44 1170

原创 List集合源码深度解析

ArrayList源码分析自定义List集合接口package com.mayikt.ext;/** * @Description: 自定义List集合 * @Author: ChenYi * @Date: 2020/06/09 20:43 **/public interface MayiktList<E> { /** * 集合的大小 * * @return */ int size(); /** *

2020-06-20 11:01:41 212

空空如也

空空如也

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

TA关注的人

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