置顶
设计模式
创建型单例模式饿汉式(在使用时进行实例化,线程不安全)
123456789101112131415public class achieve1 { private static achieve1 singleton ; // 私有化构造器 禁止外部构造 不能防止反射破环 private achieve1(){ } // 给外界提供获取实例方法 线程不安全 // 不安全的原因:同时多个线程去构造实例 public static achieve1 getInstance(){ if(singleton == null) { singleton = new achieve1(); } return singleton; }}
懒汉模式要变成线程安全的除了用饿汉模式之外,还有两种方法:
加synchronized关键字
此方法是最简单又有效的方法,不过对性能上会有所损失。比如两个线程同时调用这个实例 ...
置顶
读集合源码
Arraylist底层数据结构
1transient Object[] elementData; //元素数据底层数组实现
默认构造函数
12345public MyArrayList(){ //数组默认大小 elementData = new Object[10]; size = 0; }
简单实现增删改查方法
12345678910111213141516171819202122232425262728293031323334353637// add方法public void add(T t){ elementData[size++] = t;}// get方法public Object get(int index){ if(index > size){ throw new RuntimeException("数组没有"+index+"这个元素"); } return ele ...
置顶
javase
for 循环的执行顺序12345678910111213static boolean foo(char c){ System.out.print(c); return true; } public static void main(String[] args) { int i =0; for(foo('A');foo('B')&&(i<2);foo('C')){ i++; foo('D'); } }// 输出 ABDC BDCB
try catch finally当Java程序执行try块、catch块时遇到了return或throw语句,这两个语句都会导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块,程序立即执行return或throw语句,方法终止;如果有final ...
2pc 和 3pc
2pc所谓的两个阶段是指:第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)。
2pc 存在的问题二阶段提交中,最重要的问题是可能会带来数据不一致的问题,除此之外,还存在同步阻塞以及单点故障的问题。
首先看为什么会发生同步阻塞和单点故障的问题:
1、同步阻塞问题。执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。
2、单点故障。由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)
情况一:协调者挂了,参与者没挂这种情况其实比较好解决,只要找一个协调者的替代者。当他成为新的协调者的时候,询问所有参与者的最后那条事务的执行情况,他就可以知道是应该做什么样的操作了。所以,这种情况不会导致数据不一致。
情况二:参与者挂了,协调者没挂这种情况其实也比较好解决。如果参与者挂了。那么之后的事情有两种情况:
第一 ...
小根堆和大根堆,在使用Stream流时顺序错误
出现场景题目描述
明明生成了N 个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。
数据范围: 1≤ n ≤1000 1≤ n ≤1000 ,输入的数字大小满足 1 ≤val≤ 500 1 ≤val≤ 500
出现问题解法
123456789101112131415// 注意类名必须为 Main, 不要有任何 package xxx 信息public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); PriorityQueue<Integer> queue = new PriorityQueue<Integer>(n); while (in.hasNextInt()) { // 注意 while 处理 ...
GZIP 的压缩原理与日常应用
GZIP 的压缩原理Gzip是一种无损压缩工具,以将大块数据变得更小而闻名。
Gzip 压缩的原理是通过去除数据中的冗余信息,使用较短的代码表示频繁出现的字符或字符序列,从而减小数据文件的大小。这种压缩算法通常用于减少存储空间需求和加快网络传输速度。
LZ777
LZ77 的核心思路是如果一个串中有两个重复的串,那么只需要知道第一个串的内容和后面串相对于第一个串起始位置的距离 + 串的长度。
比如: ABCDEFGABCDEFH → ABCDEFG(7,6)H。7 指的是往前第 7 个数开始,6 指的是重复串的长度,ABCDEFG(7,6)H 完全可以表示前面的串,并且是没有二义性的。
LZ77 用 滑动窗口(sliding-window compression)来实现这个算法。具体思路是扫描头从串的头部开始扫描串,在扫描头的前面有一个长度为 N 的滑动窗口。如果发现扫描头处的串和窗口里的 最长匹配串 是相同的,则用(两个串之间的距离,串的长度)来代替后一个重复的串,同时还需要添加一个表示是真实串还是替换后的“串”的字节在前面以方便解压(此串需要在 真实串和替换“串” 之前都有存在 ...
分布式唯一ID
分布式唯一ID分布式系统全局唯一的 id 是所有系统都会遇到的场景,往往会被用在搜索,存储方面,用于作为唯一的标识或者排序,比如全局唯一的订单号,优惠券的券码等,如果出现两个相同的订单号,对于用户无疑将是一个巨大的bug。
在单体的系统中,生成唯一的 id 没有什么挑战,因为只有一台机器一个应用,直接使用单例加上一个原子操作自增即可。而在分布式系统中,不同的应用,不同的机房,不同的机器,要想生成的 ID 都是唯一的,确实需要下点功夫。
一句话总结:
分布式唯一ID是为了给数据进行唯一标识。
分布式唯一ID的特征分布式唯一ID的核心是唯一性,其他的都是附加属性,一般来说,一个优秀的全局唯一ID方案有以下的特点,仅供参考:
全局唯一:不可以重复,核心特点!
大致有序或者单调递增:自增的特性有利于搜索,排序,或者范围查询等
高性能:生成ID响应要快,延迟低
高可用:要是只能单机,挂了,全公司依赖全局唯一ID的服务,全部都不可用了,所以生成ID的服务必须高可用
方便使用:对接入者友好,能封装到开箱即用最好
信息安全:有些场景,如果连续,那么很容易被猜到,攻击也是有可能的,这得取舍。
雪 ...
网站推荐和动态定时任务
软件推荐
豆包MarsCode 是基于豆包大模型打造的智能开发工具,提供 Cloud IDE及 AI 编程助手两种使用形态。作为豆包代码模型的具体应用, 豆包MarsCode 支持智能识别当前编码任务相关的上下文信息,同时将代码理解、生成、优化、推荐、补全、审查等多维能力融为一体,无缝嵌入研发流程的各个环节,帮助开发者提升代码开发质量和效率。 官网地址:www.marscode.cn
一个网页版的vs code,代码提示一点不输idea
平时想看看源码或者刷算法题,直接网页打开编码,旁边还提供了AI功能,AI提示和改错都能免费用
目前也支持直接导入github项目
想开发一个start或者组件项目就非常方便
动态定时任务创建一个定时任务的配置文件例如task-config.ini
1printTime.cron=0/10 * * * * ?
实现一定时任务执行类
12345678910111213141516171819202122232425262728@Data@Slf4j@Component@PropertySource("classpath:/task-conf ...
java线上分析
死锁死锁模拟123456789101112131415161718192021222324252627282930313233343536public class demo01 { static Object o1 = new Object(); static Object o2 = new Object(); public static void main(String[] args) { Thread t1 = new Thread(() -> { synchronized (o1) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } ...
实现产出 1: 场景优化
介绍在测试环境中,文件导出感觉不出来性能上的差异。在完成一些需求后,导师采纳了我的代码上线了生产环境。在此之前,我已经对导出功能进行了一些优化,体现在,除去了原代码中出现的循环查库,将其进行提前预处理,以及添加了可根据条件进行导出的功能(原来的代码只有全量导出)。次日,导师跟我说,导出速度慢,具体量值:3分钟导出4-5万条数据。
初步实现导师给我的方案是:将导出数据量进行控制,只要从导出天数算起,X天的数据。在那一刻,我也并没有多去想,而是执行他给的任务。这并不困难,我只需要在对应的查询上,添加一个条件即可。项目用的是MyBatis-plus,我找到了那一个方法,添加了一个wrapper,就完成了效果。
1wrapper.ge(A::getCreateTime, LocalDate.now().minusDays(EXPORT_DAY));
测试效果:筛选完数据后,导出来的数据量大概在2万条左右,导出时间在2分钟左右。emmm….效果并没有很理想
因为本质上,这一方案并没有从技术层面上去解决!!!
分析初步优化:先问AI
EasyExcel 是一种轻量级的用于读写 Excel 文件的 ...