自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 资源 (1)
  • 收藏
  • 关注

原创 设计模式--单例模式

懒加载–单例从简入繁,一步步分析单例模式中可能存在的问题;存在线程不安全的问题,如多个线程调用getInstance() 方法时,返回的并不是同一个对象;解决方案:在getInstance()方法上添加synchronized;这样的问题在于锁的力度,因为锁的是方法 那么任何情况下访问都会产生锁竞争, 但是当instance 已经实例化后,我们没必要加锁; 那么再改进一下;这里要引出一个 doubleCheck的问题,由于到了synchronized会产生锁竞争,总会有其他线程在这里阻塞

2021-06-27 01:08:24 201

原创 网络基础

网络模型OSI网络模型物理层,数据链路层,网络层,传输层,会话层,表示层,应用层;5层网络模型物理层,数据链路层,网络层,传输层,应用层TCP协议Tcp报文格式URG:紧急标志。紧急标志为"1"表明该位有效。ACK:确认标志。表明确认编号栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。PSH:推标志。RST:复位标志。用于复位相应的TCP连接。SYN:同步标志。FIN:结束标志。

2021-05-14 10:51:21 165

原创 Springboot-自动配置原理分析

@SpringBootApplication我们在使用SpringBoot的时候都要添加这个注解,这个注解里面还包含了其他注解,完成了自动配置的功能;我们跟进去看一下使用@Import注解导入了一个类, AutoConfigurationImportSelector上一篇博客介绍了SpringBoot的启动流程,在SpringBoot启动Spring容器过程中就会对@Import注解做处理;如果大家想看Spring关于@Import, 实现了DeferredImportSelector接口的处理

2021-05-12 00:04:20 143

原创 springBoot 启动原理解析

java -jar 怎么启动SpringBoot??我们打包SpringBoot 项目时,需要使用打包的插件,此时会在打包的jar 文件下, 存在 /META-INF/MANIFEST.MF 文件,来看下这个文件的内容;Main-class: 是java -jar 命令真正调用的类Start-Class: 是由自己编写的SpringBoot入口类有没有小伙伴疑惑,这里为什么不直接使用 我们自己编写的入口呢? 我把main-class 改成我们自己编写的入口后,再启动会提示 找不到类的异.

2021-05-10 16:54:11 288

原创 spring-mybatis 整合原理剖析

spring-mybatis的基本使用1.创建mapper接口,mapper.xml文件2.配置相关信息,配置如下图3.调用SqlSessionFactoryBeanSqlSessionFactoryBean 实现了 FactoryBean, InitializingBean 这两个接口; 依据对Spring的了解,去观察相关的方法;getObject() 返回了一个SqlSessionFactory的实例, 那么我们可以断定这个类就是用来生成SqlSessionFactory对象的了;

2021-05-08 16:02:24 268

原创 Spring源码-SpringMVC

启动流程一般使用SpringMVC都需要在Web.xml中配置这几个参数,下面来追踪一下具体的代码逻辑;ContextLoaderListener由于web项目的启动是由Tomcat启动的, 不清楚会先调用这个类的哪一个方法,所以我找了一个看起来重要的方法打断点,再追踪它的调用栈, 可以发现在启动时由tomcat调用了contextInitialized()方法;我们主要关注initWebApplicationContext()方法;在ContextLoaderListener的static{}

2021-04-28 17:22:14 104

原创 Spring源码-AOP

AOP基本概念面向切面编程(Aspect-oriented Programming 简称AOPAOP) ,是相对面向对象编程(Object-oriented Programming 简称OOP)的框架,作为OOP的一种功能补充. OOP主要的模块单元是类(class)。而AOP则是切面(aspect)。切面会将诸如事务管理这样跨越多个类型和对象的关注点模块化(在AOP的语义中,这类关注点被称为横切关注点(crosscutting))。 切面(Aspect): 指关注点模块化,这个关注点可能会横切多

2021-04-23 09:30:14 110

原创 JVM-垃圾回收

垃圾回收算法分代收集理论当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几 块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可 以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选 择“标记-清除”或“标记-整理”算法进行垃圾收集。注意,“标

2021-04-02 15:59:37 52

原创 JVM-JVM运行时数据区域

JVM运行时数据区域线程栈,每个线程对应一个线程栈 存储方法运行时产生的栈帧,方法的执行和退出就对应着栈帧的入栈和出栈;1.1栈帧,每个方法调用都对应一个栈帧,栈帧有局部变量表,操作数栈,动态链接,方法返回地址等; 1.1.1局部变量表,方法运行时的局部变量。1.1.2操作数栈,方法运行时数值的操作在这里进行1.1.3动态链接,在类加载时将静态方法由符号引用转为直接引用叫静态链接,这里是当方法调用时再将符号引用转为直接引用称为动态链接;1.1.4方法返回地址,如A 方法调用B 方法,B方法

2021-04-02 08:54:30 139

原创 JVM-类加载机制

main方法是如何执行的?这里有一个简单的java方法,以这个代码说明一下;public class Demo1 { public static void main(String[] args) { System.err.println("Demo1"); }}1.编译成.class文件;2.使用java命令调用这个calss文件;3.java命令会启动c++程序,c++程序会启动jvm进程,实例化bootstartp类加载器再调用java的 sun.misc.

2021-03-31 15:23:54 78 1

原创 Redis--集群

集群redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需 要sentinel哨兵∙也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中 心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。redis集群的 性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单Redis集群搭建redis集群需要至少三个master节点,我们这里搭建三个master节点,并且给每个master

2021-03-31 08:18:30 140 1

原创 Reids进阶--持久化与哨兵集群

Redis持久化redis持久化有两种方式;1.RDB 持久化; 2.AOF 持久化;RDB持久化在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。通过调整 save 60 1000 参数来控制;在进行持久化时主线程会分支一个线程出来专门执行持久化操作,不会阻塞主线程; 也可以手动触发rdb持久化,使用bgsave命令;AOF持久化aof持久化会将每一条修改指令记录到.aof文件中(先写入缓存,依据配置的策略再写入到磁盘中);开启aof持久化 需要配

2021-03-31 08:18:02 78 1

原创 reids-基础篇

Centos8 安装Redis1.yum install gcc2.redis 官网下载redis包3.make4.修改配置文件4.1 修改daemonize yes protected-mode no 注释 bind:127.0.0.15.启动redis-server6.查看redis进程 ps -ef| grep redisRedis常用数据结构String 基本命令set key valueget keysetnx key value —key存在时返回false

2021-03-31 08:17:34 47

原创 Spring-RabbitMq整合

功能目标1.Spring整合RabbitMq 实现 helloworld 工作模式2.实现Work Queue 工作模式3.实现Publish 工作模式3.实现Routing 工作模式4.实现Topic 工作模式5.实现生产者Confirm & Return 确保消息发送成功6.实现消费者 ACK,确保消费成功7.实现延迟消息队列整合流程1.打开SpringAMQP 网站,这里有maven 引入,xml基本配置文件;SpringAMQP2.新建项目引入jar包,复制相关xml配

2021-03-25 21:33:06 103

原创 RabbitMq-入门

MQMessageQueue(消息队列),多用于分布式系统中各个服务之间传递消息;MQ的优势1.解耦在下面的系统架构中,采用同步方式进行交互,当其中任一系统宕机时。都会导致其他系统不可用;2.异步提速采用同步方式进行交互时,需要等待其他系统的返回结果才能继续往下执行;时间较长;3.削峰填谷面对突然的大流量,系统可能处理不了容易导致系统宕机,可以使用MQ来限制消费数量保证系统稳定运行;MQ的劣势1.可用性问题,由于系统/服务交互之间需要使用MQ,一旦MQ宕机那么其他系统也无法进

2021-03-25 09:38:43 120

原创 Redis--注意事项及使用优化

缓存服务架构缓存穿透缓存穿透指查询一个根本不存在的数据导致缓存层和储存层都无法命中, 缓存穿透导致每次查询都要去存储层查询,失去了缓存层保护后端存储层的意义;可能造成缓存穿透的两个原因:1. 自身代码或者数据原因2. 恶意攻击 或者爬虫软件缓存穿透的解决方案:1.空对象缓存,当查询穿透到存储层,查到为null时,将这个对象缓存起来并设置过期时间;以下是伪代码String gek(String key){ //从缓存中获取 cache=cache.get(key); if(cache=

2021-03-19 09:43:08 125

原创 reids使用场景--分布式锁

案例–商品减库存 1.商品减库存的逻辑在单体架构下可以通过synchronized关键字来保证并发问题,但是在分布式情况下就不能保证了,以下代码来验证; 环境搭建:redis ,nignx 负载均衡, springboot 项目模拟减库存,jmeter 压测工具模拟高并发;--环境不会搭的,后面留言吧,不放太多代码上来了; @GetMapping("/noLock") public synchronized String noLock(){ Integer stock

2021-03-18 11:24:06 76 1

原创 搞透并发编程---ThreadPoolExecutor

线程池 线程复用,减少线程的创建与销毁造成的性能损耗;Executors 工具类使用Executors 工具类创建的线程池有:newFixedThreadPool ; newCachedThreadPool ; newSingleThreadExecutor它们都new了同一个对象(ThreadPoolExecutor),只是传的参数不同罢了,下面介绍一下ThreadPoolExecutor的各个参数: public ThreadPoolExecutor(int corePoolSize, 核心

2021-03-15 15:18:19 71

原创 记录HashMap

JDK1.7 与 JDK1.8 HashMap不同的地方用加粗标记1. 默认数组长度 1<<4 ==16;2. 最大数组长度 1<<303. 负载因子=0.754. 链表转红黑树的链表长度=8(1.8)5. 红黑树转链表的高度=6(1.8)6. 最小转红黑树的数组长度=64(1.8)注:无论传入的数组长度是否为2的幂次方, hashmap在实际使用时都会转成2的幂次方; 如果是3–>4; 7–>8; 11–>16使用2的幂次方作为数组长度有两方面

2021-03-11 15:47:06 75 2

原创 搞透并发编程---原子性

原子性原子性指一个操作是不可中断的,一个操作一旦开始就不会被其他线程影响;public class SynchronizedTest { private volatile static int a=0; private static Object lockObj=new Object(); private static CountDownLatch countDownLatch=new CountDownLatch(100); public static void ma

2021-03-10 15:39:08 137 2

原创 搞透并发编程--有序性

代码中可能存在的有序性问题 ## as-if-serial: 不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器和处理器都必须遵守as-if-serial语义。为了遵守as-if-serial语义,编译器和处理器**不会对存在数据依赖关系的操作做重排序**,因为这种重排序会改变执行结果。但是,如果操作之间不存在数据依赖关系,这些操作可能被编译器和处理器重排序 ## happens-before: 避免编译优化对并发编程安全性的影响,需要happens-bef

2021-03-10 11:51:17 244 4

原创 搞透并发编程---可见性

并发编程存在的问题原子性,可见性,有序性,今天来深入分析一下可见性的问题是如何产生的? 又该怎么去解决? 解决可见性问题的底层原理是什么?可见性问题代码演示//-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*TestJDBC.refreshpublic class TestVolatile { private static boolean fl

2021-03-09 17:47:29 140

原创 Explain关键字详解

Explain介绍使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL 像这样Explain分析示例create table actor(id int primary key auto_increment,name varchar(10),create_time datetime) engine=innodb de

2021-03-03 15:45:14 2310 3

原创 mysql 索引

mysql的索引到底有几种? 有什么区别? 从网上搜到的资料 总说有聚簇索引,唯一索引,主键索引,联合索引,hash索引,全文索引???? 这么多类型到底是啥啊? 总感觉网上的内容看不懂,今天有机会接触到了一节mysql的课程总算是弄明白了;mysql索引的数据结构 大家可能都知道mysql的索引数据结构是**B+ Tree,**那么为什么会选择B+? B+与B Tree之间又有什么区别? (**这里不详细说数据结构,因为我也讲不清!!!)** 索引, 我理解的功能就是利用索引能够快速的查询

2021-03-02 16:14:59 50

rabbitMq 安装包

rabbitMq 安装流程,内部包含需要的rpm文件资源;

2021-03-23

空空如也

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

TA关注的人

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