通过Java实现Raft算法

前言

7月份的时候参加了一个阿里天池的性能优化比赛,后面在复赛的时候因为是集群场景,需要考虑各个节点之间数据的一致性,本来想自己实现的,但奈何时间太短(ps: 太菜了😭),最终还是找了市面上成熟的中间件来实现(Ignite)。这不,还是手痒,自己实现一个基于Raft的一致性服务。

Github:zraft

个人博客:zhaommmmomo

阅读更多

ArrayList底层逻辑与实现

重点

扩容规则:底层是System.arraycopy()这个方法

  1. 每次扩容都是将新容量设置为1.5 * 旧容量
  2. 新容量如果小于需要的容量,将新容量设置为需要的容量
  3. 新容量如果大于可以分配的最大容量(整型最大值 - 8),新容量设置为(需要的容量小于最大分配容量)需要的容量或者设置为(需要的容量大于最大分配容量)整型最大值

懒加载机制:ArrayList初始化的时候并没有直接给数组分配容量,而是使用的一个空数组进行赋值,只有当第一次增加的时候才会真正的给数组进行容量分配。这样是为了防止用户初始化后没有进行使用导致内存的浪费。(只有用户调用无参构造方法的时候才是懒加载,其他两个构造函数是分配的另外一个空数组)

阅读更多

Java中的Thread

前言

想必各位都对线程这个词不陌生,我们都知道Java中可以通过Thread、Rannable、Callable和线程池来创建一个线程。但是一个线程的创建、运行到结束到底是一个什么样的过程呢?我们以一段代码为入口点来看看Java到底是如何弄的线程。

1
2
3
4
5
public static void main(String[] args) {
new Thread(() -> {
System.out.println("run...");
}).start();
}
阅读更多

Linux中TCP三次握手的实现

前言

网上三次握手八股文一大堆,我“为了面试”也去看了看,刚好那时候接触Linux比较多,突然想到TCP三次握手在Linux内核中是如何去实现的呢?是不是会有不同?然后我就开始了漫长的百度(ps: 我比较菜,还不能拿着Linux上千个源码文件去怼)、源码之路。终于弄清了Linux中TCP三次握手的大致过程。

阅读更多