利用枚举实现策略模式 演示的demo 是以拉取短视频平台up主数据为背景,调用三方接口可能返回诸如:被限流、拉取数据失败、拉取数据次数超过每日上限等状态,而对于每种状态如果用 if else进行分支逻辑处理,一旦分支逻辑过多,代码会显得冗余且可读性较差,所以采用策略者模式进行代码优化。
JVM垃圾收集算法与垃圾收集器(Serial、ParNew、CMS) —JVM系列(四) 目前大多数垃圾收集器都是采用的分代收集算法,该算法其实算是一种思想:根据对象存活周期的不同而将内存分为年轻代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法。比如在年轻代中,每次收集都会有绝大多数对象死去(没有被GC root所引用),可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集;而老年代中的对象存活几率比较高,并且没有额外的空间对其进行分配担保,所以选择标记清除算法或者标记整理算法进行垃圾回收;需要注意,通常来讲标记清除算法或标记整理算法会比复制算法慢上许多!
与ChatGPT浅聊Pulsar 最后,Pulsar还提供了多种保证交付的机制,如At-least-once和Exactly-once,以确保每条消息都被正确地传递和处理。Pulsar的底层原理是基于分布式日志存储的架构,它采用了类似于Kafka的思想,将消息存储在一个可水平扩展的、可持久化的分布式存储引擎中,同时支持多租户。在发布/订阅模式下,消息发布者将消息发布到一个主题中,订阅者可以订阅该主题,并接收到所有发布到该主题的消息。在队列模式下,消息发送者发送消息到一个队列中,每个消费者从队列中获取消息,消费者之间实现负载均衡。
Spring 6 IOC容器加载过程与核心方法refresh源码浅析 本篇只对主线核心逻辑进行梳理分析,本篇以AnnotationConfigApplicationContext容器为例进行切入分析【Spring版本为: v6.0.2】
Spring 6 源码编译教程分享~ Spring Boot 3 RELEASE版本于 2022年11月24日 正式发布,此次Spring Boot里程碑的升级也要求了最低JDK 17 和 Spring Framework 6 ,其核心框架的 Spring 也在 2022年11月16日 迎来了从 5.3.x 到 6.0.x 重大版本升级,借着这个机会,写一篇关于 Spring 6 源码编译的教程分享。
centos 7下安装Docker(附根据操作系统日志排查问题思路) 1、Docker 要求 CentOS 系统的内核版本高于 3.10,通过uname -r命令查看你当前的内核版本 2、使用root权限登录 Centos。确保 yum 包更新到最新。6、可以查看所有仓库中所有docker版本,并选择特定版本安装
windows的cmd界面下使用jps命令提示:‘jps‘ 不是内部或外部命令,也不是可运行的程序或批处理文件 使用jps提示:‘jps’ 不是内部或外部命令,也不是可运行的程序或批处理文件,但是使用java -version却正常。
解决PageHelper循环依赖:com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration PageHelper循环依赖解决com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration
Mac使用brew优雅切换golang版本,丝滑 使用brew切换golang版本先升级brewbrew update解绑当前版本绑定brew unlink go🔍搜索可安装的go版本列表> brew search gogo@1.13 go@1.14 go@1.15 go@1.16 go@1.17 go@1.18选择想切换的版本,如这里安装go@1.18brew install go@1.18绑定版本关系brew link go@1.18🆕刷新下配置文件source .bash_p
Java获取指定年份每一个周的日期范围 需求场景:简述项目相关背景:接到项目组需求,给定年份,返回对应该年份所有周的日期范围代码:思路:一步一步来,从第1周到最后1周,最后返回list,列表的大小即是该年份的总周数public class YearWeeksUtil { public static final String START_TIME = "startTime"; public static final String END_TIME = "endTime"; /** * 获取某年某周
Java对象和Map互相转换 /** * 将对象装换为map * * @param bean * @return */ public static <T> Map<String, Object> beanToMap(T bean) { Map<String, Object> map = Maps.newHashMap(); if (bean != null) { BeanMap bean.
Redisson读写锁 在高并发场景下如果只用一把互斥锁会出现哪些问题?同一时间只能有一个请求占用,如果是大量的并发上来,性能是会急剧下降的,所有的请求都得加锁比如如果数据没有进行任何修改的话,是不需要加锁的。如果读数据的请求还没读完,这个时候来了一个写请求,这个时候是不能写数据的,不然数据就不正确了,要等到前面读锁全部释放掉以后,写请求才能执行,所以需要给这个读请求加一个标识(读锁),让写请求知道,这个时候是不能修改数据的,不然数据就不一致了。如果已经有人在写数据了,再来一个请求写数据,也是不允许的,这样也会导致数据的不
简析jvm的调优方案 调优时机:heap 内存(老年代)持续上涨达到设置的最大内存值;Full GC 次数频繁;GC 停顿时间过长(超过1秒);应用出现OutOfMemory 等内存异常;应用中有使用本地缓存且占用大量内存空间;系统吞吐量与响应性能不高或下降。调优原则:多数的Java应用不需要在服务器上进行JVM优化;多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);减少创建对象的数量;减少使用全局变量和大对象;
ThreadLocal原理分析与使用场景 什么是ThreadLocal?ThreadLocal是线程本地存储,在每个线程中都创建了一个ThreadLocalMap对象,每个线程可以访问自己内部ThreadLocalMap对象内的value。ThreadLocal的本质就是一个内部的静态的map,key是当前线程的句柄,value是需要保持的值。由于是内部静态map,不提供遍历和查询的接口,每个线程只能获取自己线程的value。这样,就线程安全了,又提供了数据共享的能力。示例:public class ConnectionManager {
Java代码实现循环队列 循环队列结构Java代码实现循环队列// 基于数组实现一个循环链表public class CircleArrayQueue<T> { // 定义数组用于存放数据 private T[] arr; private int head; // 记录队列头 private int tail; // 记录队列尾 private int size; // 数组大小 // 循环链表初始化 public CircleArrayQueue(
CopyOnWriteArrayList适用场景与原理分析 CopyOnWriteArrayList 简介CopyOnWrite机制又称为写时复制:public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}在很多应用场景中,读操作可能会远远大于写操作。由于读操作根本不会修改原有的数据,因此如果每次读取都进行加锁操作,其实是一种资源浪费。我们应该允许多个线程同时访问 List
Java代码实现栈结构 栈结构Java代码实现栈结构// 利用数组实现一个栈结构public class ArrayStack<T> { // 声明数组 private T[] arr = (T[])new Object[1]; // 栈元素初始数量 private int num = 0; public ArrayStack(int size){ this.arr = (T[])new Object[size]; } // 入栈(压
Java代码实现ArrayList ArrayList结构图Java代码实现ArrayList注意点:注意数组下标越界问题public class MyArrayList<E> { // 数组长度 private int size; // 数组已存数据的大小 private int index; // 声明数组 private E dadaArr[]; // 构造函数完成初始化 public MyArrayList(int size){ t
力扣:9. 回文数 题目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例 2:输入:x = -121输出:false解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。解法:这题和第7题整数反转类似,比较简单,不多赘述class Solution { public boolean isPalindrome(in
力扣:7. 整数反转 题目:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。示例 1:输入:x = -123输出:-321解法:class Solution { public int reverse(int x) { // 注意int类型反转后的数值可能超出int的表示范围,所以结果用long来存