自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 dubbo服务调用流程

2020-08-19 13:05:15 196

原创 多线程场景下异常回滚

思路:每个线程手动提交事务。通过栅栏,等所有子线程都执行到栅栏处等待,最后一个子线程到到时候,通过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

原创 自定义一个Starter

git地址自定义starter

2020-03-14 17:54:01 137

原创 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

原创 JVM内存管理(一):内存划分

d

2020-03-07 20:52:20 103

原创 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&lt;E&gt; 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关注的人

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