06 2022 档案
摘要:概览 Raft is a consensus algorithm for managing a replicated log:管理复制日志的一致性算法。 Consensus:[kənˈsensəs] 一致性,共识 In designing Raft we applied specific techn
阅读全文
摘要:如果说到分布式 ID,肯定逃不开 Snowflake 算法,其原理如下图 介绍如下 snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫
阅读全文
摘要:相信很多程序员对编码既熟悉又陌生,特别是 UTF-8,几乎每天都在打交道,显得格外亲切。但是 UTF-8 到底是个啥玩意儿,还有啥 Unicode、ASCII 等都是什么鬼,不少人也都是懵逼状态,仅仅瞅着眼熟。于是我就打算理一理这三者之间的关系。 ASCII 我们知道,计算机内部使用二进制存储信息的
阅读全文
摘要:本文是《Paxos到Zookeeper:分布式一致性原理与实践》读书笔记,如有雷同,实属必然。 在分布式系统中,每一个机器节点虽然能够明确地知道自己在进行事务操作过程中的结果是成功或失败,但却无法直接获取到其他分布式节点的操作结果。因此,当一个事务操作需要跨越多个分布式节点的时候,为了保持事务处理的
阅读全文
摘要:ZooKeeper 为分布式应用提供了高效且可靠的分布式协调服务,例如统一命名服务、配置管理和分布式锁等分布式的基础服务。另外,在解决分布式一致性方面,ZooKeeper 并没有直接采用 Paxos 算法,而是采用一种被称为 ZAB(ZooKeeper Atomic Broadcast)的一致性协议
阅读全文
摘要:本文是《Paxos到Zookeeper:分布式一致性原理与实践》读书笔记,如有雷同,实属必然。 对于本地事务或者是集中式的事务处理系统,我么可以采用已经被实现很成熟的 ACID 模型来保证数据的严格一致性。随着分布式事务的出现,传统单机事务模型已经无法胜任,我们期望实现一套严格满足 ACID 特性的
阅读全文
摘要:ZAB 协议 ZAB(Zookeeper Atomic Broadcast) 协议是为分布式分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复的原子广播协议。 在 Zookeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeeper 实现了一种主备模式的系
阅读全文
摘要:foreach 背后 平常我们循环一个 List 大概有下面这三种方式: 传统 for 循环 for (int i = 0; i < list.size(); i++) { } 用迭代器进行迭代遍历 Iterator itr = list.iterator(); while (itr.hasNext
阅读全文
摘要:作用 HashMap 在多线程环境中,扩容的时候可能会死循环;HashTable 只是简单粗暴的在方法上用 synchronized 进行同步,同一时刻,只会有一个线程获取到锁,其他线程全部阻塞(也有可能自旋),性能堪忧。所以 ConcurrentHashMap 诞生了。 结构 Concurrent
阅读全文
摘要:分析 LinkedHashMap是HashMap的子类,也就是说它与HashMap具有相同存储结构,不同的是,LinkedHashMap加入了一个双向循环链表,链表的头结点是一个不保存数据的head节点。 /** * The head of the doubly linked list. */ pr
阅读全文
摘要:看完HashMap内部的数据结构(数组+链表)和put get的过程,就没再去关注太多。今天脑子里就突然冒出 map 遍历的代码: for(Map.Entry<K, V> entry : map.entrySet()) { } 以前一直以为entrySet()方法就是 HashMap 内部维护了一个
阅读全文
摘要:你需要知道 HashMap内部使用一个数组来存储数据,数组的元素是一个叫Entry的静态内部类,该类不过也只是implements了定义在Map中的Entry接口。 Entry的属性: static class Entry<K,V> implements Map.Entry<K,V> { final
阅读全文
摘要:何时该用 MQ 大致可以分为下面四种场景 削峰限流:当上游能力远大于下游处理能力 数据驱动的任务依赖:任务之间有一定的依赖关系 上游不关心下游执行结果:解耦 异步返回执行时间长:离线处理,或者跨公网调用等 不应该使用 MQ 上游实时关注执行结果 保证消息不丢失 以 RabbitMQ 为例 生产者开启
阅读全文
摘要:RabbitMQ 的持久化分为三个部分: 交换器的持久化 队列的持久化 消息的持久化 交换器的持久化 交换器的持久化是在声明交换器时将 durable 设为 true。如果交换器没有设置持久化,那么 RabbitMQ 宕机重启后,交换器相关的元数据会丢失,不过相关的消息不会丢失,只是不能将消息发送到
阅读全文
摘要:持久化虽然能解决 RabbitMQ 宕机数据丢失问题,但还有个问题就是,消息到底有没有正确到达服务器呢。如果不进行特殊配置,消息发送出去后,是没有任何操作来告诉生产者消息是否到达服务器。消息在到达服务器之前就丢失了,持久化也解决不了问题。因为消息都没有,谈何持久化。 RabbitMQ 为了针对这个问
阅读全文
摘要:通过上篇《【RabbitMQ 笔记】— 死信队列》的了解,我们知道队列中的消息过期后会被 RabbitMQ 转发到 DLX(前提是要为队列添加 DLX),进而路由到死信队列。而正好可以利用这个功能(DLX + TTL)来实现延时队列,废话不多说,先看图 图中为每个过期时间设置了单独的队列,比如 qu
阅读全文
摘要:死信交换器,Dead Letter Exchange,下文简称 DLX。当消息在一个队列中变成死信(Dead Letter)之后,它会被发送到另一个交换器中,这个交换器就是 DLX,绑定 DLX 的队列就称为死信队列。 消息变成死信一般由以下几种情况: 消息被拒绝(Basic.Reject / Ba
阅读全文
摘要:通过上一篇【RabbitMQ 笔记】— 基本概念,知道生产者和消费者使用到的主要类和接口有 ConnectionFactory、Connection、Channel、Consumer 等。Connection 是用来开启 Channel 的,RabbitMQ 开发工作也基本上是围绕 Connecti
阅读全文
摘要:RabbitMQ 整体上是一个生产者消费者模型,主要负责接收、存储和转发消息。整体模型架构图如下: 生产者和消费者 生产者 Producer:生产者,就是投递消息的一方。生产者创建消息,然后发布到 RabbitMQ 中。 消息一般可以分为两部分: 消息体(payload):带有业务逻辑结构的数据,比
阅读全文
摘要:构造方法 创建线程池的方法如下: ExecutorService executor = Executors.newFixedThreadPool(8); 但是 《阿里 Java 开发手册》中禁止使用Executors工具类的方式创建线程池,而是推荐使用ThreadPoolExecutor的构造方法直
阅读全文
摘要:作用 线程池主要有以下好处 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监
阅读全文
摘要:Queue 阻塞队列(BlockingQueue)继承自 Queue,先看看 Queue 定义了哪些接口 /** * Queue 相对于 Collection 中基本的方法,提供了另外的插入,移除和检查方法。 * 每个方法都有两种形式:如果操作失败,一种是直接抛异常,另一种是返回特殊值(null 或
阅读全文
摘要:Condition 接口 在线程基础一文中说道,Java 中任何一个对象都拥有一组监视器方法(定义在 java.lang.Object 上),主要包括 wait()、wait(long timeout)、notify() 以及 notifyAll() 方法。而且这些方法使用时有个前提,就是必须先获得
阅读全文
摘要:介绍 源码中是这么说的 Basic thread blocking primitives for creating locks and other synchronization classes. LockSupport 是创建锁和其他同步组件中阻塞线程的基本原语 比如在 AQS 中的 FIFO 队
阅读全文
摘要:可重入性 概念 在说 ReentrantLock 之前,先了解下什么是可重入。假如有如下代码 private synchronized static void testA() { testB(); } private synchronized static void testB() { // do
阅读全文
摘要:在【Java 并发编程】——AQS 源码探索之独占式一文中从源码详细介绍了 AQS 独占式的实现方式。本文将介绍 AQS 的共享式,顾名思义,共享式就是允许多个线程同时访问同一个资源。 共享式实例 在独占式中,AQS 中的状态用来表示可获取或者已独占(比如 0 表示可获取,1 表示已被占用)。共享式
阅读全文
摘要:上篇通过 AQS 简单地实现了一个独占锁,锁最主要的方法就是 lock() 和 unlock(),那我们就从 lock 走起 public void lock() { sync.acquire(1); } 获取(不响应中断) 自定义组件中独占式获取便是调用同步器的模板方法 acquire(int a
阅读全文
摘要:介绍 队列同步器 AbstractQueuedSynchronizer,简称为 AQS,是用来构建锁及其他同步组件(比如 ReentrantLock、CountDownLatch)的基础框架。它使用了一个 int 成员变量表示同步状态,通过内置的 FIFO 队列来完成获取资源线程的排队工作。AQS
阅读全文
摘要:volatile 的特性 关键字 volatile 可以说是 Java 虚拟机提供的最轻量级的同步机制。 当一个变量被定义为 volatile 之后,它将具备两种特性,可见性和禁止指令重排。 可见性 这里的“可见性”是指当一个线程修改了 volatile 变量,其他线程是可以立即得知的。而普通变量不
阅读全文
摘要:final 域的重排序规则 对于 final 域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final 域的写入,与随后把这个构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重
阅读全文
摘要:1. 并发模型的两个关键问题 在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 Java 的并发采用的是共享内存模型,Java 线程之间的通
阅读全文
摘要:收集算法是内存回收的理论基础,垃圾收集器是内存回收的具体实现。在 HotSpot 虚拟机实现中,目前有 7 种垃圾收集器实现,分别是 Serial、ParNew、Parallel Scavenge、CMS、Serial Old 和 G1。前三种是新生代垃圾收集器,后面四种是老年代垃圾收集器。它们可以
阅读全文
摘要:注:本文是垃圾收集器读书笔记,内容基本来自《深入理解Java虚拟机(第2版)》 上一篇介绍了 GC 时哪些对象需要回收,本篇主要将主要介绍怎么回收,也就是垃圾收集算法。 垃圾收集算法 标记-清除算法 最基础的收集算法,分为“标记”和“清除”两个阶段:首先标记(也就是两次标记的过程)出所有需要回收的对
阅读全文
摘要:注:本文是垃圾收集器读书笔记,内容基本来自《深入理解Java虚拟机(第2版)》 要了解垃圾收集器(Garbage Collector,GC),需要从以下 3 个问题着手: 哪些内存需要回收? 什么时候回收? 如何回收? 本文解决的是第一个问题:垃圾收集器在对堆进行回收前,如何确定哪些对象还“存活”着
阅读全文
摘要:如果你对 Class 文件还熟悉的话,你应该知道 Class 文是一组以 8 位字节为单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件之中。也就是说,我们可以像读普通二进制文件一样读取 Class 文件,只不过需要遵循一定的规范(Java 虚拟机规范)。于是便有了用 Java
阅读全文
摘要:前言 Class 文件是一组以 8 位字节为单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件之中。Class 文件中存储数据有两种数据类型:无符号数和表 无符号数:Class 文件中基本的数据结构,以 u1、u2、u4、u8 来分别代表 1 个字节、2 个字节、4 个字节和 8
阅读全文
摘要:注:本文是类加载器总结,内容基本来自《深入理解Java虚拟机(第2版)》 上篇说过,类加载的过程分为 5 个阶段:加载、验证、准备、解析和初始化。 加载 “加载”是“类加载”过程的第一个阶段,在加载阶段,虚拟机主要做 3 件事情: 通过一个类的全限定名来获取定义此类的二进制字节流。 将这个字节流所代
阅读全文
摘要:生命周期 类从被加载到虚拟机内存中开始,到卸载处内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading) 7 个阶段。
阅读全文
摘要:7. 虚拟机类加载机制 7.1 概述 在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用。而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机后会发生什么变化? 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可
阅读全文