自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 rabbitMQ可靠性处理

生产者发送消息到MQ:确认应答机制MQ接收失败或路由失败:两种策略,返回客户端MQ宕机:持久化消费者无法正常消费:确认应答机制

2022-03-23 16:21:19 2348

原创 ArrayList扩容机制总结

以add()触发的扩容为例:minCapacity为size+11.如果minCapacity>数组长度elementData.length,进行grow()扩容扩容后数组长度:newCapacity = elementData.length*2数组最大长度:MAX_ARRAY_SIZE = Integer.MAX_VALUE - 82.如果newCapacity>minCapacity,说明扩容后的长度大于所需要的长度并且newCapacity>MAX_ARRAY_SIZ

2022-03-14 17:19:17 629

原创 JUC工具包下的集合

遗留的安全集合和修饰的安全集合都是使用synchronized修饰整个方法Java8:ConcurrentHashMap结构和HashMap一样,数组加链表,但是不允许空键值Get():取值全程无锁如果头结点的哈希值为-1,表示正在扩容;如果头结点的哈希值为-2,表示该链表已经变为红黑树了,这时调用对应的方法去取值如果头结点的哈希值大于0,说明是链表,直接取值即可,这里不会取到脏数据,因为值用了volatile修饰PutVal():放值如果哈希表为空,则调用initTable()(cas.

2022-03-12 15:44:06 1294

原创 缓存更新策略

先更新数据库再更新缓存 和 先更新缓存再更新数据库直接放弃,因为缓存有时候并不是数据库的直接数据,有可能是经过一系列计算得来的数据,如果更新缓存,代价太大先删缓存再更新数据库:问题:当线程A要更新数据,先把缓存删了,这时候线程B要获取数据,从缓存中得不到数据,就到数据库取,但是数据库的数据还没有被线程A更新,于是B获取到了脏数据并且将脏数据重新注入缓存中,造成以后取得数据都是脏的解决:1.加锁,将删缓存和更新数据库的操作视作一个整体,赋予原子性2.延迟双删,A删缓存,更新数据库,然后再次删缓存。

2022-03-11 19:57:59 1805

原创 自定义线程池总结

线程池:分成两个部分:线程池和阻塞任务队列先说阻塞任务队列:属性:1. 阻塞任务队列数据结构2. 从阻塞任务队列中添加任务和取走任务需要的锁3. 任务取完条件变量4. 任务为空条件变量5. 最大容量方法:1. 获取任务2. 带超时的获取任务3. 添加任务到阻塞任务队列4. 带超时的添加任务到阻塞任务队列5. 基于各种拒绝策略的放入任务到阻塞任务队列class BlockQueue<T>{ //1.阻塞任务队列 private Deque<T&

2022-03-09 11:41:53 346

原创 二分查找的各种情况

等于:public int binaryEqual(int[] nums,int target,int left,int righ){ int pos = -1; while(left<=right){ int mid = (right-left)/2+left; if (nums[mid]==target){ pos = mid; break;

2022-03-08 00:37:31 102

原创 Java高并发秒杀系统总结

项目框架搭建:1.SpringBoot环境搭建2.集成thymeleaf,封装公共返回bean RespBean3.MybatisPlus分布式会话:1.用户登录 a.设计数据库 b.明文密码二次MD5加密 c.参数校验+全局异常处理2.共享Session a.redis功能开发:1.商品列表2.商品详情3.秒杀4.订单详情系统压测:1.JMeter2.自定义变量模拟多用户3.正式压测 a.商品列表 b.秒杀页面优化:1.页面缓存+对象缓存2.页面静态

2022-03-07 18:27:23 3106

原创 给对象划分堆空间引入gc 总结

通常,给对象分配内存有两种方式:一种是指针碰撞,另一种是空闲列表。指针碰撞指针碰撞(Bump the Pointer),默认采用的是指针碰撞的方式。如果Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离。空闲列表如果Java堆中的内存不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,

2022-03-04 13:45:50 228

原创 对象的创建与类的加载

对象的创建:1.检查类是否类加载,如果没加载则进行类的加载2.在堆中划分对象的空间3.为对象的各个字段赋默认值4.为对象设置对象头5.执行init方法对对象各个字段赋值类的加载:1.加载:将class文件加载到方法区中,并在堆创建对应Class类对象2.链接:i.检查:验证class文件是否符合规范ii.准备:为静态变量分配空间,设置默认值,如果是静态常量则直接赋值iii.解析:常量池的符号引用转为直接引用3.初始化:对静态变量赋值和执行静态代码块。(类没加载先加载,父类没初始化先初

2022-03-03 12:47:21 323

原创 三种常量池

1.字符串常量池存字符串对象2.class常量池有字面量和符号引用,放在class文件里3.通过类加载,class常量池变成运行时常量池,放在方法区中,运行时常量池中符号引用变为直接引用

2022-03-03 12:46:23 59

原创 String总结

String a = “abc”;1.判断字符串常量池有没有"abc"没有则加进去,返回引用;有则返回引用总共创建一个String对象:常量池中"abc"String a = new String(“abc”);1.判断字符串常量池有没有"abc"没有则加进去2.在堆中new一个String对象,value字符数组存"abc"总共创建两个String对象:常量池中"abc",堆中"abc"String a = new String(“abc)+ new String(“def)1.判断字

2022-03-03 12:31:41 93

原创 String不可变的真正原因

String里真正存字符串的地方是value数组value数组是final的,说明value指向的地址空间不可变,此时如果直接对value元素进行赋值也是能更改的,但是value又被private修饰,且没有提供修改value数组的方法,所以无法修改value...

2022-03-01 01:40:57 207

原创 Synchronized不可打断 Reentranlock可打断

不可中断的意思是等待获取锁的时候不可中断,拿到锁之后可中断,没获取到锁的情况下,中断操作一直不会生效。Synchronized提供的打断操作只能是线程进入wait/time_wait状态后,另一个线程执行interrupt进行打断但是,当另一个线程执行interrupt时,则原线程没有锁,无法抛出被打断的异常,也就等待获取锁时不可中断Reentranlock可中断,因为有方法lockInterruptibly(),如果没有锁并且被打断的话会直接抛出被打断异常,也就是等待获取锁可中断...

2022-02-26 17:49:18 831

原创 阐明一下获得CPU时间和获得锁

一个线程,如果获得CPU时间,如果没有锁要求,直接运行时间内的代码如果获得CPU时间,有锁要求并且锁不在自己身上,阻塞到失去时间为止

2022-02-26 11:32:55 260

原创 join()导致死锁

public class Test22 { public static void main(String[] args) { Object lock = new Object(); Thread t1 = new Thread(()->{ try { Thread.sleep(1000); } catch (InterruptedException e) {

2022-02-26 11:02:18 397

原创 Redis 缓存穿透 缓存击穿 缓存雪崩 分布式锁 总结

缓存穿透:大量查询数据库中不存在的数据,穿透redis到数据库中查询,导致数据库压力大,可以用布隆过滤器解决缓存击穿:热门key过期,对于热点key的大量查询需要回数据库中查询,导致数据库崩溃,可以调整热点key的存活时间或者使用锁来解决问题缓存雪崩:短时间内大量key值过期,大量查询需要回到数据库中查询,导致数据库压力大,redis压力大,应用压力大,恶性循环直到全部崩溃,可以通过将key值得存活时间设置为随机,这样就不会短时间内有大量key值过期分布式锁:分布式情况下,而进程之间甚至可能都不在同一

2022-02-24 17:40:28 257

原创 记一个Java并发小错误

class Account{ private int money; public Account(int money){ this.money = money; } public synchronized int getMoney() { return money; } public synchronized void setMoney(int money) { this.money = money;

2022-02-23 12:03:34 233

原创 JVM浅显总结

.class文件我们都知道,class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。字面量就是我们所说的常量概念,如文本字符串、被声明为final的常量值等。符号引用是一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可(它与直接引用区分一下,直接引用一般是指向方法区的本地指针,相对偏移.

2022-02-14 18:56:39 158

原创 LRU实现总结

LRU (最近最少使用)LeetCode 146一定要按顺序:1.准备数据结构:双向链表+map (双向链表存数据,map查是否存在)2.准备LRU主体类3.准备LRU主体类方法:从put开始想,把put方法分为几个小方法,依次实现//双向链表class DLinkedNode{ //键值对数据 int key; int value; //pre和next DLinkedNode pre; DLinkedNode next; //

2022-02-12 01:42:37 397

原创 HashMap的重写的hashCode方法、重写的equals方法,hash(key)方法,get(key)方法

2022-02-11 01:12:20 526

原创 尚硅谷SSM整合项目总结

前端页面jsp+JavaScript+jquery+ajax(html+thymeleaf+JavaScript+vue+ajax)通过json前后端沟通SSM

2022-02-09 00:26:23 448

原创 MyBatis运行原理

总结:1、根据配置文件(全局config.xml,sql映射 mapper.xml)解析初始化出Configuration对象2、创建一个DefaultSqlSession对象,他里面包含Configuration以及Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor)3、DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy(MapperProxy是代理对象,通过JDK动态代理生成);.

2022-02-04 17:25:05 270

转载 MySQL索引数据结构总结

B树一个结点要存下个子结点的指针、选择做索引的那列属性值、其他属性值B+树一个结点要存下个子结点的指针、选择做索引的那列属性值叶结点存选择做索引的那列属性值和其他属性值1、同等数据量时,B+Tree 的查询效率比 B-Tree 高,由于 B+Tree 的非叶子节点只存储 key 信息,而 B-Tree 的节点存储了 key + data,而每个页(一个节点)的大小是固定的,所以 B+Tree 的树高会更低一些(我理解就是b+树的倒数第二层的每一个结点的选择做索引的那列属性值是这个结点的子树

2022-01-31 16:26:52 76

原创 数据结构与算法:反转链表

一边画图一边做就能做出来迭代法:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.ne

2022-01-31 01:43:47 241

原创 快应用总结

应用开发(前端框架 + 组件 & API 能力):以Web前端的方式开发原生应用,也就是根据MVVM前端框架,V-DOM机制,业务API和UI组件来开发一个快应用。(快应用的前端设计借鉴并整合了主流前端框架(Vue,React等)的设计思路:以组件化的方式构建应用,以数据绑定为核心的MVVM设计模式,以V-DOM的方式提升性能,同时选择了简洁清晰的类Vue的模板。同时对布局方面做了相应精简。从新的应用形态、映射原生UI、能力开放的角度,需要定义一套组件与API规范,方便开发这快速开发应用。).

2022-01-29 23:46:32 509

转载 三次握手四次挥手

https://mo.mbd.baidu.com/r/AnCPpkc4Tu?f=cp&u=c39a1138082f03a3

2022-01-28 10:23:24 38

原创 Spring 事务总结

XML配合注解:第一步:xml配置第二步:添加@Transactional事务注解完全XML完全注解ps:@Transactional注解内有很多属性1.progation:事务传播行为https://segmentfault.com/a/11900000133413442.isolation:事务隔离级别具体看我的文章3.剩下的...

2022-01-23 16:59:21 108

原创 数据库 事务三重封锁协议和四种隔离级别的关系

排它锁又叫写锁(X锁),事务A对数据D加了排它锁,其它任何事务都不能再对数据D加共享锁或者排它锁。也就是说A可以读取或者修改D,但是其它事务不能读也不能写,但是!!即使数据D加了写锁,其它事务的最基本的select语句还是可以读数据D的,因为最基本的select语句并不用申请任何锁!这个是最迷惑的地方,明白了这一点,一级封锁协议协议会读脏数据就很好理解了。事务A对数据D=1加了排它锁,修改了数据使D=2,这个时候事务B虽然不能对数据D加任何锁,但是可以用select语句读,B读到了数据D=2,之后事务A出错

2022-01-23 16:28:01 1483 3

原创 Spring AOP(AspectJ)

术语切入点表达式Execution([权限修饰符][返回类型][全类名][方法名称][参数列表])其中权限修饰符可以省略,默认public参数列表可以用…来表示基于AspectJ注解实现AOP第一步:开启注解扫描和开启生成代理对象第二步:创建被增强类并且加上注解@Component创建增强类(代理类)并且加上注解@Component和@Aspect第三步:配置不同类型的通知前置通知:@Before(一定执行)后置通知:@After (一定执行,相当于finally)环绕

2022-01-23 14:40:33 149

原创 Spring5 Bean管理(注解方式)

XML配合注解第一步:引入依赖包第二步:开启组件扫描第三步:类上加注解第四步:基于注解方式实现属性注入(1)@Autowired:根据类型注入(2)@Qualifier配合@Autowired:根据名称注入(3)@Resource:可以根据类型也可以根据名称(4)@Value:注入普通属性完全注解开发配置类代替XML配置开启扫描:代替创建ApplicationContext实例的区别:代替...

2022-01-23 13:47:58 133

原创 单例模式总结

单例模式的优点我们从单例模式的定义和实现,可以知道单例模式具有以下几个优点:1.在内存中只有一个对象,节省内存空间;2.避免频繁的创建销毁对象,可以提高性能;3.避免对共享资源的多重占用,简化访问;4.为整个系统提供一个全局访问点。单例模式的使用场景由于单例模式具有以上优点,并且形式上比较简单,所以是日常开发中用的比较多的一种设计模式,其核心在于为整个系统提供一个唯一的实例,其应用场景包括但不仅限于以下几种:  1.有状态的工具类对象;2.频繁访问数据库或文件的对象;饿汉式publi

2022-01-20 23:35:46 384

原创 内部类总结

public class Outer { static String name = "outer"; //成员内部类 public class Inner1{ void doit(){ System.out.println("成员内部类"); } } //静态内部类 public static class Inner2{ void doit(){ Sys

2022-01-20 22:05:17 149

原创 线程——synchronized到底锁的是什么

修饰非静态方法:锁的是调用这个方法的对象可以看到begin()和end()方法使用synchronized关键字,存在两个线程调用同一个对象thing。执行过程:thing调用begin(),锁thing,begin()完成,释放thing,thing调用end(),锁thing,end()完成,释放thin结果:更改后可以看到,因为每个线程都是new的新对象thing,分别调用begin和end锁的对象也就不同了,所以begin不会阻塞end方法再次修改:将end方法的synchroni

2022-01-20 20:18:05 74

原创 工厂模式总结

1.简单工厂模式Car接口规定汽车的具体功能Benz类和Tesla类具体实现Car接口,重写具体功能CarFactory根据判断调用Benz类和Tesla类的构造方法来实现创建各种类型汽车的功能2.工厂方法模式与简单工厂模式不同的在于:CarFactory接口用于规定各个工厂生产汽车的方法,生产不同汽车由不同实现类工厂去具体实现3.抽象工厂模式Consumerpublic class Consumer { public static void main(String

2022-01-20 13:19:29 246

原创 Spring IOC xml自动装配

什么是自动装配?根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入,不再需要手动装配<property name="dept" ref="dept"></property>byName:根据属性名称,则类属性名称要与对于bean id相同byType:根据类型,如果有两个指定类型的bean,则报错...

2022-01-20 00:23:41 77

转载 Spring bean生命周期

1.实例化bean对象(通过构造方法或者工厂方法)2.设置对象属性(setter等)(依赖注入)3.如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)4.如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身5.将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object be

2022-01-19 19:45:16 55

转载 Spring bean作用域

在Spring中,bean作用域用于确定哪种类型的bean实例应该从Spring容器中返回给调用者。目前Spring Bean的作用域或者说范围主要有五种。1.singleton:单例,spring bean的 默认scope就是singleton加载 spring 配置文件时候就会创建单实例对象2.prototype:多例不是在加载 spring 配置文件时候创建 对象,在调用getBean()方法时候创建多实例对象转载:https://blog.csdn.net/kongmin_123

2022-01-19 19:08:13 51

原创 Spring5 Bean管理(xml方式)

IOC1.注入方式(1)set方法(在要注入的类中必须写对应属性的set方法)(2)有参构造器方法(在要注入的类中必须写包含对应属性的有参构造器方法)(3)p名称空间注入第一步:加入p名称空间第二步:普通属性:p : 属性名 = “值”对象属性: p :属性名-ref=“值”注入属性1.注入字面量2.注入属性-外部bean(bean写在外部,与外界共享,用ref选择)3.注入属性-内部bean(bean作为一个属性直接写在内部,不与外界共享)4.级联赋值(意思就是更改

2022-01-19 18:12:38 101

原创 java集合总结

java集合list:1.arraylist:基于数组2.linkedlist:基于链表set:1.hashset:基于hashmap,使用hashcode方法判重2.treeset:基于treemap,使用重写的comparato方法判重,有序map:1.hashmap:基于链表数组,即每个元素都为链表的数组,其中链表元素为node(key,value)。put即放入node过程:先将key值使用hashcode方法求出hash值,然后通过算法将hash值转化为数组下标:如果数组下标没有

2022-01-19 02:43:49 232

原创 jvm内存模型

1.方法区 method area2.堆 heap3.java栈 stack4.本地方法区 native method area5.程序计数器 pc6.本地方法接口7.执行引擎

2022-01-19 00:34:02 164

空空如也

空空如也

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

TA关注的人

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