- 博客(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 628
原创 一次重构经历
改造前 一次开发需求,看到了某位前辈写的一段极糟心的代码。大致是长下面这个样子 if (resident.getCustomerName() == null) { resident.setCustomerName(""); } if (resident.getPhone() == null) { resident.setPhone(""); } if (resident.getBirthday
2021-11-15 16:00:56 460
原创 一条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 758 1
原创 DDD理解
贫血领域对象 只用作数据载体,问没有行为和动作 贫血症和失忆症 业务代码复杂时,封装了大量的方法,原本的代码意图会逐渐不明显,这种情况称为贫血症引起的失忆症 解决复杂和大规模软件的武器可以被粗略地归为三类:抽象、分治和知识。 分治 分而治之,高内聚 低耦合 抽象 对业务领域问题的抽象 知识 DDD 可以认为是知识的一种 分治一般有两种手段,mvc 代码结构 或者 业务领域通过业务维度来划分 DDD提供了这样的知识手段,让我们知道何时去抽象出界限上下文以及如何去分治 DDD的界限上下文完美匹配微服务拆
2021-06-18 17:48:45 454
原创 4-BeanFactoryPostProcessor
BeanFactoryPostProcessor BeanFactory 的 后置处理器 bean 创建之前执行 BeanDefinitionRegistryPostProcessor 执行时机,先执行 BeanDefinitionRegistryPostProcessor . postProcessBeanDefinitionRegistry spring 容器的 refresh() 创建刷新 1、prepareRefresh(); 1.initPropertySources(); 初始化属性
2021-06-08 21:05:54 154
原创 3-spring的声明式事务底层源码分析
百度定义: 以方法为单位,进行事务控制,抛出异常,事务回滚。 最小的执行单位为方法,决定执行成败是通过是否抛出异常来判断的,抛出异常即执行失败; 声明使用事务 @EnableTransactionManagement 容器启动时,注入两个类 AutoProxyRegistrar 往下跟 发现注入了这个类 InfrastructureAdvisorAutoProxyCreator InfrastructureAdvisorAutoProxyCreator extends AbstractAdvisor
2021-06-08 21:03:13 98
原创 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 102
原创 接口和抽象类的区别
相同点: 1、都不能被实例化 2、接口的实现类 和 抽象类的 子类只有完全实现 了 接口和 抽象类的 方法 才能被实例化 不同点: 1、接口关键字是 interface 、 抽象类 是 abstract class 2、单继承 多实现 3、抽象类可以有抽象方法也可以没有、可以有具体的实现方法也可以没有,接口只能有抽象方法 public abstract 公开抽象,并且变量 必须是 public static final ,并且必须初始化 4、抽象类强调的是行为,接口强调的是功能; 抽象类往往用来表征对问题
2021-05-20 21:43:33 63
原创 spring-1、基础及组件使用
Spring 是一种开源轻量级框架,是为了解决企业应用程序开发复杂性而创建的, Spring 致力于解决 JavaEE 的各种解决方案,而不仅仅于某一层的方案; 贯穿于表现层、业务层、持久层,然而并没有取代已有框架,只是以高度的开放性,与已有框架进行整合; 目标: 1、让现有的技术更容易使用。 1、促进良好的编程习惯。 坚持一个原则:不重复造轮子。 已经有较好解决方案的领域,绝不重复性实现。比如:对象持久化和OR 映射,Spring 只对现有的JDBC,Hibernate 等技术提供支持,使之更容易使用,
2021-05-10 21:19:54 147
原创 6、并发安全
类的线程安全定义,怎么才能做到类的线程安全? 栈封闭 变量在方法内部申明;这些变量都处于栈封闭;栈是线程私有的(安全); 无状态 类内部无任何成员变量; 让类不可变 让状态不可变 所有包装类都不可变 ; 1、对于一个类来讲,所有的成员变量应该是私有的,同样的只要有可能, 所有的成员变量应该加 final 关键字; 2、不提供任何可修改成员变量的方法,同时,成员变量也不做为方法的返回值; Akka 框架 volatile 保证类的可见性;最适合一个线程写,多个线程读的情景;( ConcurrentH
2021-02-05 16:18:07 184
原创 5、线程池
什么是线程池?为什么要使用线程池? 1、降低资源的消耗,降低线程创建和销毁的资源消耗 2、提高响应速度,避免创建销毁消耗时间; 3、提高线程的可管理性 实现一个我们自己的线程池 1、线程必须在池子已经创建好,并且可以保持住,要有容器保存多个线程 2、线程还能接受外部的任务并且运行; JDK中的线程池和工作原理 ThreadPoolExecutor ,jdk所有线程池实现的父类 各个参数的含义 int corePoolSize, 核心线程数, < corePoo
2021-02-03 21:31:32 123
原创 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 134
原创 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 209
原创 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 155
原创 1、线程基础、线程之间的共享和协作
基础概念: cpu核心数 和 线程数的关系: 1:1;超线程技术 - > 1:2 cpu时间片轮转机制: rr调度,上下文切换 什么是进程和线程: 进程:程序运行资源分配的最小单位,进程内部有多个线程,多个线程共享这个进程的资源; 线程:CPU调度的最小单位, 澄清并行和并发: 并发:与时间单位相关;单位时间内可以处理事情的能力; 并行:同一时刻,可以处理事情的能力; 高并发编程的意义,好处和注意事项: 意义 1、可以充分利用CPU 的资源; 2、加快用户...
2020-08-26 17:34:46 152
原创 单例模式
采取一定的方法在整个软件系统中,对某个类 只能存在一个对象实例,并且该类只提供一个取得该对象实例的方法(静态); 注意事项和细节说明: 1.单例模式保证了系统内存中该类只存在一个对象;节省了系统资源;对于一些需要频繁创建修改的对象,使用单例模式可以提高系统性能; 2.当想实例化一个单例类的时候 必须要使用获取相应对象的方法,而不是new ( ); 3.单例模式使用的场景: 需要频繁的创建和销毁的对象; 创建对象时,耗时过多或耗费资源过多(重量级对象),但又经常使用的对象、工具类对象、频繁访问数据库或文件的
2020-08-05 11:31:15 119
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人