自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 拦截器打印返回值的方法

记录一个拦截器打印返回值的方法,有点奇葩。 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { ResponseFacade responseFacade = (ResponseFacade) res

2020-07-07 14:26:21 1167 1

原创 常用的JVM命令

个人常用的JVM命令记录以下,方便后面查阅首先通过-XX:+PrintFlagsFinal查看默认参数配置作一个对比监控方面的:1.打印GC详情-XX:+PrintGCDetails2.打印GC时间-XX:+PrintGCDateStamps3.GC前后打印堆情况-XX:+PrintHeapAtGC4.打印GC之间应用运行的时间-XX:+PrintGCApplicationCurrentTime5.GC造成的停顿时间-XX:+PrintGCApplicationStoppedTime

2020-07-06 22:53:05 226

原创 TCP/IP 笔记

待补充

2020-06-02 11:19:42 287 1

原创 RocketMq 设计原理

一.消息存储commitLog:commitLog文件是消息持久化的表现形式。producer提交完消息后,broker会将消息首先持久化到commitLog中。commitLog的写入是顺序写入的。每个commitLog文件大小默认1G。每个消息占一个偏移量。当文件写满了,就写入下一个文件ConsumerQueue:消费队列,RocketMq是采取数据与索引分离的架构。想一想,如果consumer直接通过commitLog进行消费,那每次消费时都需要按照topic遍历commitLog文件是

2020-05-24 21:12:24 349

原创 RocketMq什么时候会重复消费

1.消费者负载均衡当我们的Consumer定义为BroadCast广播模式的话,每个ConsumerGroup下的consumer都会获得全量消息。此时拉取消息时不同的节点会得到相同的消息。而cluster集群模式下,负载均衡策略(RebalanceImpl)会将多个ConsumerQueue平均分配给ConsumerGroup下的消费者实例(默认平均分配策略),不会出现同一个消费者组中有两个或以上的consumer实例消费同一个队列。比如:consumer1:queue1,queue2consum

2020-05-24 19:13:32 2073

原创 RocketMq生产者组和消费者组

ProducerGroup(生产者组):一个生产者组,代表着一群topic相同的Producer。即一个生产者组是同一类Producer的组合。如图,Producer_1、Producer_2、Producer_3 为一个ProducerGroup,因为他们都订阅了topicA。同理Producer_4、Producer_5、Producer_6为另一个ProducerGroup,他们订阅了topicB。如果Producer是TransactionMQProducer,则发送的是事务消息。如果节点1

2020-05-24 13:17:34 27056 2

原创 reactor线程模型

以下为个人学习心得,只提供参考一、阻塞io:public void runServer(int port) throws IOException { ServerSocket serverSocket = new ServerSocket(port); while (true) { Socket socket = serverSocket...

2020-05-06 20:06:18 236

原创 jvm内存区域

一.程序计数器程序计数器其实就是一个程序所执行的字节码行号的指示器。通过这个指示器可以选取下一条要执行的字节码为了线程上下文切换时可以恢复到以前的状态,所以每个线程都有一个私有的程序计数器,使得各个线程之间互不影响。如果执行的是java方法就则计数器存储的是正在执行的字节码指令地址,如果是native方法则为空,因此程序计数器是唯一一块不会发生OOM的内存区域。二.虚拟机栈虚拟机栈也是线...

2020-04-27 23:32:00 84

原创 读写锁的使用以及降级优化

一.读写锁特征读写锁的形式如下 ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); Lock readLock = readWriteLock.readLock(); Lock writeLock = readWriteLock.writeLock();1.读读共享 volatile In...

2020-04-27 23:13:01 270

原创 ReentrantLock源码来认识AQS

AQSAQS个人理解就是一个有优先级的获取锁的线程队列,用cas高效获取锁,同时通过等待线程的挂起大幅减少cas带来的cpu消耗ReentLock独占模式解析以下只分析了独占模式的lock。//默认实现非公平锁 public ReentrantLock() { sync = new NonfairSync(); }基类:为公平锁和非公平锁提供基本方法 abs...

2020-04-26 23:24:05 140

原创 jvm 参数GC日志打印启动参数

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/Users/h/Desktop/gc.log

2020-04-17 17:54:09 895

原创 通过FutureTask构建缓存

代码中为了效率一般会构建缓存来提高性能 减少不必要的计算。一般情况下会通过构建一个hashMap来存储缓存比如:Map<String, Object> map = new HashMap<>();public void test(Object param){if (map中不存在param为key的缓存){ 1.//计算........ 2.将计算结果...

2019-12-08 17:02:13 227

原创 委托实现线程安全性

1

2019-12-02 20:14:59 294

原创 同步工具类

1.闭锁(CountDownLacth)2.futureTask(Callable)3.信号量(Semaphore)4.栅拦(CyclicBarrier)

2019-12-02 20:06:02 97

原创 获取方法返回值泛型的真实类型

//反射获取返回值 Method method = clazz.getMethod("xxx"); Class<?> returnType = method.getReturnType(); if (returnType==List.class){ Type type = method.getGen...

2019-11-21 15:40:20 2615

原创 spring批量添加bean的方法

读了源码的都知道DefaultListableBeanFactory有很多关于Bean注册和获取bean的方法 比如xmlBeanFactory就是继承自DefaultListableBeanFactory 如果可以拿到就可以手动注册bean了代码如下:@Configurationpublic class TestConfig { @Autowired private Ap...

2019-11-20 10:06:31 1577

原创 数据结构跳跃表java版实现

跳跃表解释代码实现(只实现了新增,打印和判断是否存在)public class SkipList { private static class Node { Integer key; String value; Node up = null, down = null, left = null, right = null; ...

2019-11-14 15:38:08 144

原创 InputStreamReader

InputStreamReader是字节流到字符流的转化器 File file = new File("/Users/huangzhicheng/Documents/github/designdemo/src/main/resources/spring-context.xml"); FileInputStream fileInputStream = new FileInputSt...

2019-11-02 21:48:11 169

原创 获取inputStream的的方法

1.利用ClassLoader InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("spring-context.xml");2.Resource类型的对象 Resource resource=new ClassPathResource("spring-context.xml")...

2019-11-02 21:18:23 1558

原创 实例封闭保证线程安全以及内置锁和对象锁的思考

如果某对象不是线程安全的 为了保证其线程安全 可以配合代理模式 封闭真实对象的访问权限 在代理方法中添加线程安全的访问方法public class InstancePrivate<K, V> { private Map<K, V> map = new HashMap<>(); public synchronized V put(K key,...

2019-10-29 09:16:30 113

原创 hashMap 容量相关的部分源码解读

首先HashMap有这几个参数 /** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * The maximum capacity,...

2019-10-10 10:17:43 84

原创 记录一下spring静态获取bean的工具类

/** * @author: hzc * @Date: 2019/07/30 14:43 * @Description: 由于依赖spring容器只有spring容器初始化完成后才能使用 所以不能在任何的bean类的全局变量初始化,代码块以及构造函数中使用 */@Componentpublic class SpringUtil implements ApplicationContex...

2019-10-09 16:49:43 557

原创 分布式锁 配合aop进行封装

之前写过一个分布式锁,应该是参考了比较落后的redis版本 这次会在之前的基础之上用aop进行封装并简化代码重复的内容不再赘述,具体的参考一下链接https://blog.csdn.net/qq_36559868/article/details/98174986maven配置一下aop 和redis <dependency> <gro...

2019-10-09 15:54:57 366

原创 分布式布隆过滤器 基于redis

1.bitMap(位图)bitMap中用一位代表一个值 常见应用在数据去重bitMap空间复杂度不会随着数据量的增大而增大bitMap空间复杂度会随要存储的数据元素的最大值线性增大比如存 ‘4’ 会直接存在第4位 那么64bit类型的数据 最大值为2^64 那么要存到bitMap中 就要找到第2^64次方比特位存这个数 就需要2^64bit=2EB空间 和天文数字一样不现实。hash...

2019-09-30 13:41:16 2027 2

原创 netty构建简单的http服务器

初学netty 原理后面再弄 ,首先还得熟悉整体流程以及代码的熟练度1.程序入口public class main { public static void main(String[] args) throws Exception { //boss线程 EventLoopGroup boss = new NioEventLoopGroup(); ...

2019-09-09 19:43:37 105

原创 装饰模式和代理模式详解

1

2019-08-27 13:55:00 139

原创 简单易懂的适配器模式

适配器模式主要是为了让不符合当前接口标准的对象 变得符合这一标准看上去比较难懂 那就直接举例子上代码如下一个场景定义一个人 这个人能做什么事public interface Human { void doSomething();}定义一个具体的行为 说话public class Action1 implements Human{ @Override pub...

2019-08-08 17:07:29 93

原创 建造者模式 构建数据结构的链表

最近迷上设计模式 这次带来的是建造者模式1.建造者模式将复杂的对象构建过程 分解开 降低耦合度,大幅提高可读性2.建造者和工厂模式个人理解:建造者侧重于对象构建的过程,精髓在于director中如何去builer组装对象。工厂模式侧重于构建对象的结果,客户端代码主要关注的是获取作者规定好的对象。3.使用场景实例jdk源码是学习设计模式很好的路径例如:jdk中 StringBui...

2019-08-08 15:13:48 95

原创 vilatile的使用

Volatile:作用:在cpu多核环境下保证多核之间同一份数据的可见性1.在有syn锁的情况下不用volatile。syn的对象锁都是同一个所以保证了各线程的可见性。2.线程安全的不用考虑 因为不涉及到一致性问题3.不依赖于当前状态的写入。虽然不存在线程安全性问题但是也缺少了syn的可见性保证,所以需要volatile提供可见性保证4.需要禁止重排序的问题。比如双重校验锁单例模式 。...

2019-08-06 09:28:30 277

原创 使用责任链模式 构建自己的过滤器

1.责任链模式通过将耦合在一起的业务逻辑分离开,达到解耦效果。2.代码:责任链抽象类public abstract class Handler { /** * 存储处理器的队列 */ public static BlockingQueue<Handler> localQueue = new ArrayBlockingQueue<>...

2019-08-06 09:27:33 245

原创 学习一下分布式锁 尝试手写 基于lettuce

1.redis客户端 jedis和lettuce网上大部分是基于jedis的分布式锁 jedis是多线程下不是线程安全的 lettuce是基于netty线程安全性能高,springboot2.0都采用lettuce,所以分布式锁最好基于lettuce2.分布式锁原理采用原子操作如下:如果不存在key就设置这个key 存在这个key就阻塞住等待锁key自动或手动释放3.多线程或多进...

2019-08-05 19:29:07 1073

空空如也

空空如也

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

TA关注的人

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