自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MQ如何保证消息不丢失

一、MQ会产生消息丢失的场景1.1 生产者到MQ阶段生产者发送消息到MQ,单纯的这种操作并不能保证MQ确实收到消息。另外,比如生产者端是在进行远程调用的情况,那么本地事务是否操作成功,MQ并不得知。begin:发送消息;本地数据库操作;commit;如果本地数据库操作失败回滚,但是消费者端操作成功,会导致数据不一致。1.2 MQ主从数据同步阶段MQ接收到消息,进行主从同步的时候失败,则会导致主从数据不一致,造成消息丢失。1.3 MQ数据刷盘持久化阶段MQ还未进行消息持久化宕机,

2021-03-23 14:57:42 1219 1

原创 学习心得

本篇主要是思想总结,没有技术干货,只是一些底层知识的学习感触。神隐在面临一些海量数据处理的时候,计算机的处理速度也会很长,这可能导致我们系统出现一段时间的不可用,或者表现在用户端就是突然间的卡顿。回想到之前学习过的框架也好,底层算法也罢。对于此类问题有个统一的解决思路-------拆分过程这些东西目前在我脑海里还很抽象,我尽量举一些例子具象化。redis中的hash结构,它有一个扩容机制,当负载因子达到一定数值,就会触发hash的扩容,但是如果此时 hash 中的数据量已经非常大,扩容操作将会耗费

2021-03-20 21:37:31 106

原创 CMS和三色标记法

概念ParNew补充一下ParNew垃圾收集器,能够和CMS配合使用,在回收年轻代时采用标记复制算法,回收老年代采用标记清除算法。STWSTW,全称 stop the world 世界静止。也就是在GC阶段,需要暂停所有的用户线程,以便合理的完成垃圾回收。什么叫做合理的完成?来看看不暂停用户线程带来的问题:其一:假如我这边刚刚标记A对象不是垃圾对象,你用户线程这边又把A对象的引用置为空,那岂不是这次就没有回收到,只能等到下次GC才能回收。其二:已经标记A对象是垃圾,结果用户线程又重

2021-03-20 21:05:36 461

原创 消息中间件常见问题及解决方案

消息的可靠性业务流程说到消息的可靠性,首先看一下整个消息链过程阶段一:消息在provider端产生,发送出来至消息中间件阶段二:消息中间件接收provider发送的消息阶段三:consumer从消息中间件拉取消息进行消费问题产生消息从产生到消费,至少就要经历上述两个网络过程,期间出现网络连接问题,或者某端宕机等问题,都会导致消息的丢失。解决方案生产者端生产者发送消息至中间件,需要有确认机制,消息中间件确认收到,并将确认信息发送至生产者。如果有需要,还需要给消息设置一个全局唯一ID

2021-03-19 19:59:12 480

原创 分布式事务及解决方案(一)

一、什么是分布式事务在微服务架构当中,我们将系统中的各个功能模块拆分,甚至是数据库也进行了分库。那么当涉及到一个事务要求时,则其中的一致性则成了一个大问题。什么应该算是一个事务呢经典案例:张三向李四跨银行转账300块钱其中涉及到两个不同数据库的写操作:张三余额 -300李四余额 +300如果张三扣款失败,而李四余额增加成功了,则不满足一致性如果张三扣款成功,而李四余额增加失败了,也不满足一致性也就是说这两个操作必须两个一起成功,一个失败,则另一个要进行回滚,保证数据的一致性,这就叫

2021-03-19 19:20:17 244 2

原创 关于前篇内存分配的补充

对象动态年龄判断当前放对象的Survivor区域里(其中一块区域,放对象的那块s区),一批对象的总大小大于这块Survivor区域内存大小的50%(-XX:TargetSurvivorRatio可以指定),那么此时大于等于这批对象年龄最大值的对象,就可以直接进入老年代了,例如Survivor区域里现在有一批对象,年龄1+年龄2+年龄n的多个年龄对象总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代。这个规则其实是希望那些可能是长期存活的对象,尽早进入老年代。对象动态

2021-03-14 15:58:16 69

原创 JVM 垃圾回收前置知识

什么是垃圾?严格来说对于JVM而言什么算垃圾?了解过类加载之后,应该知道,JVM的运行时数据区中分配一块堆内存,里面存放了我们的实例对象。那么什么样的对象才算垃圾呢?我们通常创建一个对象时一般是这样色儿的:User user = new User();可以这样简单理解,new去帮我们在堆当中创建了User对象实例,并且把这个实例的引用返回赋值给了user变量。那么我们可以这样去理解一个“合格”的对象,首先它得存在(堆中有实例),其次它被引用着(这里就包含上面那样被一个变量引用,还包含着如果这个

2021-03-14 15:45:37 126

原创 JVM内存结构

整体结构内容解释JVM包含有:堆,方法区,程序计数器,线程栈,本地方法栈前两者是线程共享的,后三者是线程私有堆被所有线程共享的一块内存区域,在虚拟机启动的时候创建,用于存放对象实例。对可以按照可扩展来实现(通过-Xmx 和-Xms 来控制)当队中没有内存可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。老年代:2/3的堆空间年轻代:1/3的堆空间eden区:8/10 的年轻代survivor0: 1/10 的年轻代survivor1:1/10的年轻代

2021-03-12 13:26:11 120 4

原创 整合Mabatis-plus

一、导入依赖<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version></dependency><dependency> <groupId>org.freemarker&l

2021-03-11 20:39:45 143

原创 spring 拦截器

拦截器的船新版本实现方式:自定义拦截器:public class LoginInterceptor implements HandlerInterceptor{ //preHandle是在请求执行前执行的 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

2021-03-11 20:37:04 87 2

原创 Springboot集成AOP

maven依赖<!--引入SpringBoot的Web模块--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency> <!--引入AOP依赖--><dependency> <gr

2021-03-11 20:33:38 394

原创 Redis几大数据结构的应用场景和常见命令

String单值缓存set key valueget key对象缓存set user:1001 value(json格式数据)mset user:1001:name zhangsan user:1001:age 20mget user:1001:name mget user:1001:age分布式锁setnx product:1001 lock //返回1代表加锁成功 0表示失败del product 1001 //完成业务逻辑之后一定要释放锁set pro

2021-03-11 20:26:01 120

原创 redis持久化

RDB快照将数据当前的形式全部保存启动通过save指令,手动执行一次数据持久化操作。在redis.conf中配置的dir指定目录下会生成一个rdb文件(默认名称为dump.rdb)相关配置dbfilename dump.rdb设置本地数据库文件名,默认为dump.rdb。通常设置为dump-端口号.rdbdir设置存储.rdb文件的目录通常设置在存储空间较大的目录中,名为datardbcompression yes设置存储至本地数据库时是否压缩数据,默认yes,采用LZF压缩。默认

2021-03-11 20:09:58 62

原创 redis主从复制原理

主从复制原理主从复制分为两种方式,全量复制和增量复制全量复制描述发生在slave初始化阶段,此时slave刚连上主节点,需要将主节点上的数据全部拷贝下来,并清空自己原有数据。步骤slave连上master,发送sync命令master接收到sync命令之后,执行bgsave指令,生成RDB文件,在生成RDB文件过程中master执行的指令将会放在缓冲区中master生成完RDB文件之后,将其发送给slave,并且再此期间继续记录执行的指令到缓冲区中slave接收到RDB文件之后,丢弃旧数

2021-03-11 20:04:02 69

原创 多线程核心技术(第一章纪要)

start方法做了些什么?jvm通知操作系统创建Thread操作系统开辟内存,并使用createThread函数创建Thread线程对象操作系统对Thread对象进行调度,确认执行时机Thread在操作系统中被执行启动一个线程后,jvm直接调用run方法线程启动的顺序与start方法执行顺序无关System.out.println方法内部同步问题i–与println方法一样会出现线程安全问题,因为i–发生在进入println方法之前public void println(String

2021-03-11 20:00:16 77

原创 spring mvc核心知识

请求流程客户端发起请求前端控制器收到请求调用处理器映射器处理器映射器根据请求的url,找到具体的处理器,生成处理器对象及处理器拦截器,一起返回一个handlerExecutionChain前端控制器根据handlerExecutionChain,通过Handler适配器调用处理器处理器适配器执行响应的handlerhandler返回ModelAndViewHandlerAdapter将处理器执行结果ModelAndView返回给前端控制器前端控制器根据ModelAndView对象向视图解

2021-03-05 16:26:55 95

原创 configurationClassPostProcessor

整体结构按照该类中方法的调用顺序进行介绍configurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor接口。在invokeBeanFactoryPostProcessor中第一个调用到也就是我们第一个获取容器中beanDefinitionRegistryPostProcessor的bean名称时得到该类,并执行实现的postProcessBeanDefinitionRegistry方法public void postP

2021-03-05 16:24:06 137

原创 IOC -- bean的创建过程

Bean的创建过程refreshfinishBeanFactoryInitializationpreInstantiateSingletonsgetBeandoGetBean实例化属性注入初始化总的过程就是这几步,下面详细走一下,从第三步开始preInstantiateSingletons该方法是在finishBeanFactoryInitialization方法中被执行。作用是实例化剩余的单实例bean方法由DefaultListableBeanFactory实现先获取ioc

2021-03-05 16:21:50 275

原创 invokeBeanFactoryPostProcessors

简介调用bean工厂的后置处理器解析初始化三个集合//第一步:首先调用BeanDefinitionRegistryPostProcessor的后置处理器Set<String> processedBeans = new HashSet<>();//保存BeanFactoryPostProcessor类型的后置List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>(

2021-03-05 16:11:40 730

原创 IOC初始化源码

概念DI:依赖注入IOC:控制反转容器初始化以注解的方式启动配置类@Configuration@ComponentScan(basePackages = "com.text")public class MainConfig { public MainConfig() { System.out.println("MainConfig"); }}启动类public class MainStat { public static void main(String

2021-03-05 16:00:33 61

原创 AOP--切面解析源码

整体流程按照箭头方向对每个方法的进行解析resolveBeforeInstantiation该方法并没有做什么特别的事情,只是对applyBeanPostProcessorsBeforeInstantiation方法进行了调用bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);applyBeanPostProcessorsBeforeInstantiation获取容器中所有的后置处理器,通过调用get

2021-03-05 15:51:33 138

原创 String类

几个核心问题intern方法字符串常量池、class常量池和运行时常量池equals方法创建String的不同方式,其对象的保存和创建过程线程安全问题以及不可变性StringBuffer和StringBuilder创建字符串的方式String s1="hi";String s2=new String("hi");不同创建方式的创建过程:字面值的方式:使用双引号会在字符串常量池中寻找是否已经存在 “hi” 这个字符串,如果有则直接返回该对象的引用,如果没有则在字符串常量池创建

2021-02-03 16:11:49 54

原创 spring循环依赖

什么是循环依赖循环依赖指bean之间相互依赖,但是注意只能是set注入属性类型(单例)的循环依赖能够被spring解决,如果是在构造函数中则会抛出异常BeanCurrentlyInCreationException什么是三级缓存 /** 一级缓存 这个就是我们大名鼎鼎的单例缓存池 用于保存我们所有的单实例bean */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(25

2021-02-03 16:08:20 98 1

原创 spring-ioc源码

一句话AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(MainConfig.class);IOC容器的初始化,通过这样一句话完成。加载入我们的配置类 MainConfig.class 这里我们采用的是注解配置类的方式。一分三进入到源码中,new AnnotationConfigApplicationContext(),究竟做了哪些事?public AnnotationConfig

2021-02-03 16:04:44 67

原创 Reentralock的加锁流程

reentrantlock的加锁流程非公平锁加解锁流程线程1执行如下操作:(出现竞争)CAS尝试将state由0设置为1,结果失败进入tryAcquire逻辑,再次失败进入acquireQueued逻辑- 创建Node队列创建两个 Node,其中第一个Node成为哨兵,用来占位,不关联线程在acquireQueued逻辑中,线程会进入一个死循环,两次失败过后会进入park阻塞如果自己是第二个Node节点关联的线程,那么会进行一次tryAcquire尝试如果

2021-02-03 16:03:43 483 1

原创 java线程

线程的优先级cpu采用时间片的形式调度运行的线程,当线程所分配的时间片用完之后,会发生线程调度,并等待下次分配。线程所分到的时间片多少也就决定了该线程所使用处理器资源的多少。线程优先级就是觉得线程需要多或者少分配一些处理器的资源通过成员变量priority 控制,范围 1~10,默认5。线程的优先级具有继承的特性,如果用A线程去启动B线程 ,那么B线程的优先级和A线程一致线程的分类默认情况下,java进程需要等待所有线程都运行结束,才会结束。主线程:守护线程:只要其它非守护线程

2021-02-03 16:00:33 173 1

原创 java内存模型

主内存与工作内存首先在介绍java内存模型中的主内存和工作内存之前,先介绍一下处理器的效率问题硬件的效率和一致性由于计算机的存储设备与处理器的运算速度有着几个数量级的差距,现代计算机都不得不加入一层或多层读写速度尽可能接近处理器运算速度的高速缓存,来作为内存与处理器之间的缓冲:将运算需要使用的数据复制到缓存中,让运算能快速进行,当运算结果结束后再从缓存中同步回内存中,这样处理器就无须等待缓慢的内存读写了。CPU缓存一致性从上面的描述可以看出,当多个处理器在同时运算共同的数据时,对于共享数据的一致

2021-02-03 15:56:36 47

原创 java共享模型

共享问题资源共享由于线程和进程的关系,在上一篇并发基础中有写到,多个线程可共享一块内存区域,并且每个线程也都有自己独立的工作空间。经典案例:从这里我们开始对自增自减进行迫害 static int counter = 0; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for

2021-02-03 15:54:56 177

原创 HashMap

核心问题HashMap中的位运算,为什么采用位运算,为什么是2的n次幂?HashMap中的扩容HashMap中的主要成员变量get方法put方法寻找索引HashMap的结构主体还是一个存放Node节点的数组产生hash冲突之后,进行链化,在对应索引位置形成链表寻找索引/** 1.7 */final int hash(Object k) { int h = hashSeed; if (0 != h && k instance

2021-02-03 15:50:40 69

原创 深拷贝和浅拷贝

什么是拷贝引用拷贝Employee e=new Employee("zhangsa", "232", 23);Employee e2=e;sout(e);sout(e2);//结果hashcode相同上述操作叫做引用拷贝,对象创建在栈中,e保存着对象的引用地址,而e2=e则是将引用地址赋值给e2,即e2同e一起指向栈中的同一个对象对象拷贝Employee e=new Employee("zhangsa", "232", 23); Employee clone=null; clo

2021-02-03 15:49:15 65

空空如也

空空如也

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

TA关注的人

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