自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 String.match 优化

查看 String 源码时发现: 调用 matches 方法时, 在内部 为正则表达式创建了一个 Pattern 对象,却只用了一次。 之后就可以进行垃圾回收了。 // String 这是String 的 matches 方法 public boolean matches(String regex) { return Pattern.matches(regex, this); } // Pattern public static boolean matches(String r

2021-12-01 21:50:59 488

原创 一次重构经历

改造前 一次开发需求,看到了某位前辈写的一段极糟心的代码。大致是长下面这个样子 if (resident.getCustomerName() == null) { resident.setCustomerName(""); } if (resident.getPhone() == null) { resident.setPhone(""); } if (resident.getBirthday

2021-11-15 16:00:56 413

原创 一条sql优化引起的回忆

回忆 又感悟了新东西,想起来在 上家 看到的一段sql where id < xxx limit 10 前端传上次 记录最小id 过来查询,同样达到了分页的效果 LIMIT offset, length 中的offset值过大 SQL查询语句会非常缓慢   SELECT * FROM `table_name` limit 100000,10; SELECT * FROM `table_name` ORDER BY `id` DESC limit 100000,10; SELECT *

2021-11-10 21:31:31 695 1

原创 垃圾回收机制

垃圾回收

2021-06-24 16:24:04 167

原创 DDD理解

贫血领域对象 只用作数据载体,问没有行为和动作 贫血症和失忆症 业务代码复杂时,封装了大量的方法,原本的代码意图会逐渐不明显,这种情况称为贫血症引起的失忆症 解决复杂和大规模软件的武器可以被粗略地归为三类:抽象、分治和知识。 分治 分而治之,高内聚 低耦合 抽象 对业务领域问题的抽象 知识 DDD 可以认为是知识的一种 分治一般有两种手段,mvc 代码结构 或者 业务领域通过业务维度来划分 DDD提供了这样的知识手段,让我们知道何时去抽象出界限上下文以及如何去分治 DDD的界限上下文完美匹配微服务拆

2021-06-18 17:48:45 408

原创 4-BeanFactoryPostProcessor

BeanFactoryPostProcessor BeanFactory 的 后置处理器 bean 创建之前执行 BeanDefinitionRegistryPostProcessor 执行时机,先执行 BeanDefinitionRegistryPostProcessor . postProcessBeanDefinitionRegistry spring 容器的 refresh() 创建刷新 1、prepareRefresh(); 1.initPropertySources(); 初始化属性

2021-06-08 21:05:54 116

原创 3-spring的声明式事务底层源码分析

百度定义: 以方法为单位,进行事务控制,抛出异常,事务回滚。 最小的执行单位为方法,决定执行成败是通过是否抛出异常来判断的,抛出异常即执行失败; 声明使用事务 @EnableTransactionManagement 容器启动时,注入两个类 AutoProxyRegistrar 往下跟 发现注入了这个类 InfrastructureAdvisorAutoProxyCreator InfrastructureAdvisorAutoProxyCreator extends AbstractAdvisor

2021-06-08 21:03:13 74

原创 2-AOP

简书 https://www.jianshu.com/p/5aa33f1b9c3d?utm_campaign=haruki public interface Aware { } @Component public class Light implements ApplicationContextAware, BeanNameAware,EmbeddedValueResolverAware { private ApplicationContext applicationContext;

2021-06-08 20:56:58 80

原创 接口和抽象类的区别

相同点: 1、都不能被实例化 2、接口的实现类 和 抽象类的 子类只有完全实现 了 接口和 抽象类的 方法 才能被实例化 不同点: 1、接口关键字是 interface 、 抽象类 是 abstract class 2、单继承 多实现 3、抽象类可以有抽象方法也可以没有、可以有具体的实现方法也可以没有,接口只能有抽象方法 public abstract 公开抽象,并且变量 必须是 public static final ,并且必须初始化 4、抽象类强调的是行为,接口强调的是功能; 抽象类往往用来表征对问题

2021-05-20 21:43:33 46

原创 spring-1、基础及组件使用

Spring 是一种开源轻量级框架,是为了解决企业应用程序开发复杂性而创建的, Spring 致力于解决 JavaEE 的各种解决方案,而不仅仅于某一层的方案; 贯穿于表现层、业务层、持久层,然而并没有取代已有框架,只是以高度的开放性,与已有框架进行整合; 目标: 1、让现有的技术更容易使用。 1、促进良好的编程习惯。 坚持一个原则:不重复造轮子。 已经有较好解决方案的领域,绝不重复性实现。比如:对象持久化和OR 映射,Spring 只对现有的JDBC,Hibernate 等技术提供支持,使之更容易使用,

2021-05-10 21:19:54 125

原创 6、并发安全

类的线程安全定义,怎么才能做到类的线程安全? 栈封闭 变量在方法内部申明;这些变量都处于栈封闭;栈是线程私有的(安全); 无状态 类内部无任何成员变量; 让类不可变 让状态不可变 所有包装类都不可变 ; 1、对于一个类来讲,所有的成员变量应该是私有的,同样的只要有可能, 所有的成员变量应该加 final 关键字; 2、不提供任何可修改成员变量的方法,同时,成员变量也不做为方法的返回值; Akka 框架 volatile 保证类的可见性;最适合一个线程写,多个线程读的情景;( ConcurrentH

2021-02-05 16:18:07 152

原创 5、线程池

什么是线程池?为什么要使用线程池? 1、降低资源的消耗,降低线程创建和销毁的资源消耗 2、提高响应速度,避免创建销毁消耗时间; 3、提高线程的可管理性 实现一个我们自己的线程池 1、线程必须在池子已经创建好,并且可以保持住,要有容器保存多个线程 2、线程还能接受外部的任务并且运行; JDK中的线程池和工作原理 ThreadPoolExecutor ,jdk所有线程池实现的父类 各个参数的含义 int corePoolSize, 核心线程数, < corePoo

2021-02-03 21:31:32 84

原创 3、显示锁和AQS

3、显示锁和AQS 原子操作CAS atom(不可分割) 什么是原子操作?如何实现原子操作? synchronized 基于阻塞的锁机制 可以实现,但会引发以下问题 1、被阻塞的线程优先级很高 2、拿到锁的线程一直不释放锁怎么办? 3、大量的竞争,消耗CPU,同时带来死锁或者其他安全问题。 CAS的原理 利用了现代处理器都支持的CAS指令,循环这个指令,直到成功为止; CAS(Compare And Swap),指令级别保证这是一个原子操作; 三个运算符: 一个内存地址 V 、 一个期望值 A

2021-01-12 12:01:01 90

原创 4、并发容器

ConcurrentHashMap Hash 散列,哈希:把任意长度的输入通过一种算法(散列),变换成固定长度的输出,这个输出值就是散列值;属于压缩映射,容易产生哈希冲突; 常见算法 直接取余, md4、md5、sha 哈希算法,摘要 冲突解决办法: 开放寻址 再散列 链地址法 HashMap线程为什么不安全 put操作会引起死循环,hashMap里的entry链表产生环形的数据结构,entry的next 永远不为null; https://www.cnblogs.com/wfq9330/p/9

2020-10-10 17:06:11 172

原创 2、线程的并发工具类

线程间协作 轮询:难以保证及时性;资源开销大 等待和通知 wait(); notify();/ notifyAll(); 对象上的方法 等待和通知的标准范式 等待方: 1、获取对象的锁; 2、循环里判断条件是否满足,不满足调用 wait 方法; 3、条件满足执行业务逻辑; 通知方: 1、获取对象的锁; 2、改变条件; 3、通知所有等待在对象的线程; 等待超时模式实现一个连接池 假设 等待时间时长为 T ,当前时间 now + T 以后超时 long overtime = now + T ; long r

2020-08-31 17:48:11 131

原创 1、线程基础、线程之间的共享和协作

基础概念: cpu核心数 和 线程数的关系: 1:1;超线程技术 - > 1:2 cpu时间片轮转机制: rr调度,上下文切换 什么是进程和线程: 进程:程序运行资源分配的最小单位,进程内部有多个线程,多个线程共享这个进程的资源; 线程:CPU调度的最小单位, 澄清并行和并发: 并发:与时间单位相关;单位时间内可以处理事情的能力; 并行:同一时刻,可以处理事情的能力; 高并发编程的意义,好处和注意事项: 意义 1、可以充分利用CPU 的资源; 2、加快用户...

2020-08-26 17:34:46 126

原创 单例模式

采取一定的方法在整个软件系统中,对某个类 只能存在一个对象实例,并且该类只提供一个取得该对象实例的方法(静态); 注意事项和细节说明: 1.单例模式保证了系统内存中该类只存在一个对象;节省了系统资源;对于一些需要频繁创建修改的对象,使用单例模式可以提高系统性能; 2.当想实例化一个单例类的时候 必须要使用获取相应对象的方法,而不是new ( ); 3.单例模式使用的场景: 需要频繁的创建和销毁的对象; 创建对象时,耗时过多或耗费资源过多(重量级对象),但又经常使用的对象、工具类对象、频繁访问数据库或文件的

2020-08-05 11:31:15 95

原创 设计模式

2020-08-05 11:18:20 68

空空如也

空空如也

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

TA关注的人

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