- 博客(42)
- 收藏
- 关注
原创 自定义容器:批处理任务
需求容器容量达到10则批处理,如果超过5s容量没有10,也进行批处理。实现/** * @Desc: * @Author: heling * @Date: 2021/5/6 14:49 */@Slf4jpublic class BatchHandleList extends Vector<String> { private static volatile BatchHandleList list; //集合容量达到10则批处理 private stat
2021-05-06 15:53:49
341
原创 单例模式总结
Demo/*** @Desc:饿汉式-静态成员变量* @Author: heling* @Date: 2021/4/29 13:59*/public class HungrySingleton { // 类加载的时候初始化一次,且线程安全 private static final HungrySingleton instance = new HungrySingleton(); private HungrySingleton(){ } publ.
2021-04-29 15:01:02
316
原创 Redis:慢日志slowlog
redis.conf 慢日志配置################################## SLOW LOG #################################### The Redis Slow Log is a system to log queries that exceeded a specified# execution time. The execution time does not include the I/O operations..
2021-04-01 16:44:45
626
原创 基于权重的随机负载均衡算法
public class WeightRandomLoadBalanceTest { private static final Random random = new Random(); public static String select(List<Server> serverList) { // 总权重 int totalWeight = 0; int size = serverList.size(); .
2021-01-30 16:52:45
438
原创 使用缓存提升频繁通过反射调用方法性能
getDeclaredMethod方法返回的Method对象其实都是一个新的对象,且新对象的root属性都指向原来的Method对象,如果需要频繁调用,最好把Method对象缓存起来。测试用例/** * @Desc: * @Author: heling * @Date: 2020/9/2 9:29 */public class Test { public static Map<String, Method> map = new HashMap(); pub
2020-09-02 15:06:12
634
1
原创 多线程场景下异常回滚
思路:每个线程手动提交事务。通过栅栏,等所有子线程都执行到栅栏处等待,最后一个子线程到到时候,通过redis里面存储的成功数量是否和总数量一致,是则提交所有事务,否则回滚所有事务。@Servicepublic class TestService { @Autowired private DataSourceTransactionManager txManager; public void test() throws ExecutionException, Inte
2020-07-23 16:31:24
1580
原创 Parallel GC
英文原文地址:https://plumbr.io/handbook/garbage-collection-algorithms-implementations#parallel-gcThis combination of Garbage Collectors usesmark-copyin the Young Generation andmark-sweep-compactin the Old Generation. Both Young and Old collections trigger ...
2020-07-01 16:24:16
574
原创 Concurrent Mark and Sweep
翻译文档地址:https://plumbr.io/handbook/garbage-collection-algorithms-implementations#concurrent-mark-and-sweepThe official name forthis collection of garbage collectors is “Mostly Concurrent Mark and Sweep Garbage Collector”. It uses the parallel stop-the-wo.
2020-07-01 15:15:49
359
原创 Integer
Integer:颠覆你的认知 一、装箱拆箱 & Integer缓存 一道面试题 答案质疑 Integer.valueOf(int i)的玄机 IntegerCache 二、值传递和引用传递 一道面试题 解法一 解法二(错误) 解法三 Integer:颠覆你的认知 本文涉及的知识点:值传递和引用传递、自动装箱和拆箱、Integer缓存 一、装箱拆箱 & Integer缓存 一道面试题..
2020-06-08 00:21:38
214
原创 Mybatis缓存体系:二级缓存
Mybatis缓存体系:二级缓存一、概要前面Mybatis是应用级别的缓存,执行查询是先查询二级,没有命中才查询一级缓存,否则查询数据库。值得注意的是,不同于一级缓存,因为二级缓存是作用于应用的,那么就存在一个脏读的问题,所以就引入了事务缓存。二、使用在Mapper映射文件里配置<cache></cache>即可,那么整个mapper下就会启用二级缓存。也可以粒度控制到方法,比如在配置useCache为false,那么该方法就不会使用二级缓存。另外二级缓存是作用
2020-05-31 00:22:17
434
原创 Mybatis缓存体系:一级缓存
Mybatis缓存体系:一级缓存概要一级缓存是会话级别的,也就是一个SqlSession里的,不同会话的一级缓存是互相隔离,不可见的,当会话结束,一级缓存也就被销毁。一级缓存维护在BaseExecutor类中:一级缓存开启和关闭一级缓存默认是开启的。如何关闭呢?一级缓存是没有关闭配置的,也就是说代码中都会设置一级缓存,我们配置的关闭缓存实际是代码中清空一级缓存而已,看源码:BaseExecutor#querypublic <E> List<E> query(
2020-05-30 22:25:41
729
1
原创 ThreadLocal & InheritableThreadLocal
ThreadLocal关系图ThreadLocal#set() public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else
2020-05-23 15:21:43
185
原创 如何给特殊字符串加索引:如身份证、邮箱等
1 建表语句 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_card` varchar(18) NOT NULL, `email` varchar(50) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDBINSERT INTO `test`.`user`(`id`, `id_card`, `email`) VALUES (1, '32102319930316..
2020-05-14 18:02:42
4110
原创 JDK8中HashMap源码细节死扣
在《JDK8中HashMap源码精读》中有留下一些待扣问题,本篇将做解答,并会对7和8中HashMap做一些对比和补充问题。loadFactor默认值为啥是0.75?加载因子越小,那么Map更容易达到扩容的条件,扩容频繁,带来的好处就是发送hash碰撞的概率小了,链表短,查询效率高了,缺点就是频繁扩容,损耗性能,就是“空间换时间”; 加载因子越大,就扩容就不那么频繁,那么发生hash冲突的概率就大,链表就会长,查询效率低了,但是空间利用率高了,就是“时间换空间”;所以,0.75是一个折衷的取.
2020-05-10 23:03:04
267
原创 JDK8中HashMap源码精读
1 字段1.1 字段解读//默认容量等于16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //最大容量static final int MAXIMUM_CAPACITY = 1 << 30;//默认加载因子,可以自己调节static final float DEFAULT_LOAD_FACTOR = 0.75f;final float loadFactor;//链表转红黑树阈值,当>=8时候,转
2020-05-10 17:34:06
168
原创 记录锁、间隙锁和临键锁
记录锁、间隙锁和临键锁Record LockA record lock is a lock on an index record.For example,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;prevents any other transaction from inserting, updating, or deleting row...
2020-05-05 19:34:05
4422
6
原创 MVCC(multi version concurrency control):多版本并发控制
MVCC需要解决的问题?解决事务一致性的问题,保证一个事务中前后两次读取数据一致,实现事务隔离。这个问题也可以通过锁来解决,但是这就不支持并发读写,从而导致数据读写效率低。什么是MVCC?为了保证一个事务中前后两次读取数据的一致性,在修改数据的时候建立备份或者叫快照,即使后面数据被被别的事务修改或者删除了,在当前事务之内是查不到的。实现原理InnoDB为每行...
2020-05-05 16:57:43
187
原创 RocketMQ:事务消息
什么是事务消息What is transactional message?It can be thought of as a two-phase commit message implementation to ensure eventual consistency in distributed system. Transactional message ensures that the ...
2020-04-25 18:30:35
492
原创 RocketMQ之消息的存储
1、MQ消息消息存储的选择1.1、消息存储方式主要分为以下几种: 分布式KV存储: 比如ActiveMQ中采用的levelDB、Redis, 这种存储方式对于消息读写能力要求不高的情况下可以使用 文件存储系统: 常见的比如kafka、RocketMQ、RabbitMQ都是采用消息刷盘到所部署的机器上的文件系统来做持久化,这种方案适合对于有高吞吐量要求的消息中间件,因为消息刷...
2020-04-25 15:55:00
649
原创 RocketMQ几个核心概念
ProducerA producer sends messages generated by the business application systems to brokers. RocketMQ provides multiple paradigms of sending: synchronous, asynchronous and one-way.官网翻译过来就是消息发送者发送...
2020-04-25 15:50:28
212
原创 zookeeper选举源码解读
git地址;https://github.com/wangheling/zookeeper入口:org.apache.zookeeper.server.quorum.QuorumPeerMain.main
2020-03-21 15:38:38
137
原创 Zookeeper客户端Curator实现分布式锁源码探究
文章目录导读1 :获取锁:acquire()构造方法获取锁StandardLockInternalsDriver#createTheLock()LockInternals#internalLockLoop()2 释放锁:release()导读zookeeper实现分布式锁原理就是:因为zk节点不可重名,所以一次只有一个客户端会写入成功,同时利用临时节点,当客户端断开连接时候,删除临时节点。但...
2020-03-15 22:30:42
241
原创 SpringBoot中的spi机制(2): 实现原理
文章目录1 @EnableAutoConfiguration2 @Import(AutoConfigurationImportSelector.class)3 AutoConfigurationImportSelector3.1 AutoConfigurationImportSelector#selectImports3.2 META-INF/spring-autoconfigure-metada...
2020-03-14 00:20:34
244
原创 SpringBoot中的spi机制(1): 一个Demo了解什么是spi
什么是spi机制英文是service provider interface,就是一种拓展点,服务发现的机制。示例Demo第一步 新建一个maven工程结构如下:里面有两个类package spi;/** * @Author: heling * @Date: 2020/3/8 20:59 * @Description: */public class SpiDemo {...
2020-03-09 20:39:26
1117
原创 JVM内存管理(二):垃圾判定以及垃圾回收算法
1 如何判断一个对象是否是垃圾1.1 引用计数法如果一个对象被别的地方引用一次就计数+1、否则-1,等于0的时候代表没有任何引用,可以视为是垃圾,可以被GC。缺点就是一个循环引用的问题,比如对象A和对象B相互引用,但是A没有被任何其他除B对象引用,B也没有被任何其他除A对象引用,这就造成了A和B的引用计数都等于1,这就造成了他们都不是垃圾,无法GC。但是实际测试发现A和B都被回收了,那么可...
2020-03-07 22:19:44
168
原创 CyclicBarrier源码解读
首先看他的两个构造方法:/** The number of parties */private final int parties;/* The command to run when tripped */private final Runnable barrierCommand;public CyclicBarrier(int parties, Runnable barrierAc...
2020-02-21 11:11:09
110
原创 ReentrantLock和AbstractQueuedSynchronizer源码解读
ReentrantLock lock = new ReentrantLock();lock.lock();lock.unlock();首先解释几个成员变量:抽象类AbstractQueuedSynchronizer中:内部类Node:获取锁失败的线程会封装成Node放入到队列head:同步队列的头Nodetail:同步队列的尾Nodestate:是一个int值,...
2020-02-18 23:48:21
147
原创 ArrayBlockingQueue源码分析
ArrayBlockingQueue是阻塞队列,FIFO先进先出。阻塞队列api:插入:add(e):添加元素到队列中,如果队列满了,继续插入元素会报错,IllegalStateException。offer(e):添加元素到队列,同时会返回元素是否插入成功的状态,如果成功则返回 trueoffer(e,time,unit):当阻塞队列满了以后继续添加元素,...
2020-02-11 22:56:54
100
原创 Spring Bean的生命周期
什么是Spring Bean的生命周期? 在一个 bean 实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个 bean 不在被调用时需要进行相关的销毁操作,并从 bean 容器中移除。下面正式开始:Spring Bean的生命周期是四个阶段,每个阶段都会有拓展点:1.实例化 Instantiation2.属性赋值 Popul...
2020-02-07 18:29:02
147
原创 Spring如何解决循环依赖问题
什么是循环依赖? 比如A依赖B,而B又依赖A,当实例化A的时候,要实例化B,B又依赖A。然而A没有实例化完成,所以就陷入了死循环,Spring是如何解决循环依赖的问题呢?源码解读在AbstractApplicationContext#refresh()方法中:public void refresh() throws BeansException, Illega...
2020-02-05 19:40:07
394
原创 Mybatis源码解读
Mybatis源码解读入口@Test public void testSelect() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); ...
2019-12-21 23:28:39
189
原创 为何自定义线程工厂(ThreadFactory)
JDK创建线程池如果没有指定线程工厂则会使用了默认的线程工厂(DefaultThreadFactory)既然有默认工厂,为啥还要自定义线程工厂呢?原因如下:1.可以设置有意见的线程名,这样方便我们开发调试,问题日志查找及定位。2.可以设置守护线程。3.设置线程优先级4.处理未捕获的异常:在执行一个任务时,线程可能会由于未捕获的异常而终止,默认处理是将异常打印到控制台。但这种...
2019-07-03 16:04:17
3663
原创 观察者模式实际应用场景-----Spring事件机制
以下伪代码是一个保存订单的功能,并会发送短信消息:/*** Author heling on 2019/1/9*/@Servicepublic class OrderServiceImpl implements OrderService { @Override public void saveOrder() { //1.创建订单 Sy...
2019-01-10 12:46:51
10578
3
原创 JDK8源码阅读笔记--------java.util.LinkedList
官方文档:链表实现list和deque接口,可以存储所有元素,包括null。该类不是同步的,如果多线程访问同一链表,并且至少有一个线程修改了,则必须外部同步。 List list = Collections.synchronizedList(new LinkedList(...));1.public E getFirst()、public E getLast()2.public ...
2018-11-28 17:26:16
147
原创 JDK8源码阅读笔记--------java.util.ArrayList
官方文档:该类实现list接口,属于collections,是一个动态数组,可以存放任何元素包括null,初始容量为10,添加元素时候容量可以自动增长。该类不是同步的,也就是说不是线程安全的。如果多个线程同时方位一个实例,并且其中一个修改了列表,那么必须在外在同步。我们可以包装列表如:List list = Collections.synchronizedList(new ArrayLis...
2018-11-28 16:59:21
122
原创 JDK8源码阅读笔记--------java.util.List
List是一个有序集合,元素可以重复,是一个接口,继承Collections接口。1.int size();2.boolean isEmpty();3.boolean contains(Object o);4.Iterator<E> iterator();Returns an iterator over the elements in this list in p...
2018-11-28 16:38:21
187
1
原创 设计模式:六大原则
一、单一职责原则意思是每个类都只负责单一的功能,切不可太多,并且一个类应当尽量的把一个功能做到极致。违背该原则代码示例:package com.whl.sixPrinciple;import java.io.*;/** * Author heling on 2018/11/27 */public class Caculator { public int add...
2018-11-27 18:12:00
131
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人