03 2023 档案
摘要:Leader 选举过程中怎么把票发出去的?发出去后其他节点是怎么收到票的? 这两个问题的答案说简单点那肯定是通过网络传输,那问题又来了:节点之间是怎么建立连接的? 先来分析下 Leader 选举发起投票以及接收投票这部分内容的网络通信原理以及简易架构图,然后再对照着思想进行源码剖析。话不多说,让我们
阅读全文
摘要:Leader 选举的核心底层原理可以很简单地概述为:核心参数是 logicClock 逻辑时钟、 epoch、事务次数、myid,核心流程为:先对比 logicClock,再对比 epoch,其次对比事务次数,最后对比myid。 一、投给自己,异步广播 首先明确的一点是只有状态是 LOOKING 的
阅读全文
摘要:其实在 Java 并发编程这个领域中,隐藏了许多的“设计模式”,并发编程的设计模式和我们常谈的“单例模式”、“工厂模式”这类“设计模式” ,其实可以理解为都是对代码精良设计的思想提炼。 Producer Consumer 模式 Producer-Consumer 模式是大众们使用最多的模式之一,它的
阅读全文
摘要:ThreadLocal的功能在Java多线程并发环境中非常实用,其作用是提供线程本地变量,例如用户ID、会话ID等与当前线程密切关联的信息。那么它在实际业务场景中可以怎么使用呢?让我们一起来看看下边这个案例。 有一台 Web 服务器,需要设计一个组件,用于记录每次请求完整执行的耗时时长,整体流程如下
阅读全文
摘要:相信在实际工作中,大家对于线程池的使用并不陌生,例如以下几个应用场景: 支付成功之后,异步发送短信通知用户; 公司的OA系统中,提交某些申请之后,异步发送给各个部门负责人进行审批; 请求某个接口时,需要做些日志上报之类的记录。 线程池的使用 下边是一个非常简单的线程池使用案例: public cla
阅读全文
摘要:Java 内部提供了两种方式来解决线程安全问题,一种是加入synchronized 关键字,另一种则是使用 Lock 锁。虽然说这两种方式都能解决掉线程安全的问题,但是在某些场景下会稍微有些麻烦,例如下边这个场景,每次请求接口都会对 reqCount 做一次加一操作: @RestController
阅读全文
摘要:相信大家在实际工作中,都或多或少了解过生产者消费者模型,在一些基于内存进行设计的消息队列模型中,当有新消息写入的时候,消息会被投递到一条内存队列中,然后消费者会自动收到通知进行消费。 通常我们称投递消息的一方为生产者,取出消息的一方为消费者。如果要用伪代码去表示这个流程的话,大概如下所示: //生产
阅读全文
摘要:AQS 全称是 AbstractQueuedSynchronizer,是一个抽象队列同步器,JUC 包的大部分并发工具类都是依托于它去实现的,所以如果希望理解 JUC 中的各种组件原理,就一定要搞懂AQS。 我个人认为,AQS 内部的许多机理,其实和现实生活中的某些场景还是比较相似的,例如银行办理业
阅读全文
摘要:
阅读全文
摘要:在面对一些线程安全问题时,需要加入一把锁来进行防范,而 synchronized 就是这方面的代表之一。可能你会有所疑惑,既然有了 synchronized 这把锁,为什么JDK中还会有 Lock 的定义呢?其实这个还和 synchronized 的历史背景有关。 在 JDK 早期版本中,synch
阅读全文
摘要:通常在多线程执行的过程中,我们需要考虑一些线程安全的问题,而线程安全问题中最常用的解决策略之一就是 “锁”。 加锁的本质,就是为了解决在多线程场景中对于共享数据访问的安全问题,这类问题通常会被我们称之为线程安全问题。当我们提及到“锁”这个关键字的时候,就不得不了解下 synchronized 了。
阅读全文
摘要:在多线程编程过程中,总会或多或少地接触到多线程这个概念。而 Java 的并发编程领域,想要使用线程技术,就不得不得接触到 java.lang.Thread 这个类。 很多程序员都使用过java.lang.Thread 这个类,但是大多数人可能只停留在了下边这种操作情况: Thread t = new
阅读全文
摘要:经典的 i++ 问题 我们来看看下边这段 Java 代码: public class ThreadDemo { private static int i = 0; static class IncrTask implements Runnable { CountDownLatch start; Co
阅读全文
摘要:Leader 选举 的原理,也就是大名鼎鼎的 Zab 协议的一部分。 Zab 只是一个协议,或者说只是一个概念,ZooKeeper 是这个协议的具体实现,并不是只有选举用到了 Zab 协议,而是其他地方也用到了。 一、什么是 Leader 选举? 在开始设计之前,我们肯定要先搞懂需求,产品一句话:实
阅读全文
摘要:什么是分布式事务 我们平常使用事务的时候,基本流程是这样的: 使用BEGIN/START TRANSACTION来开启一个事务。 然后可以继续向服务器发送一些增删改查语句,这些语句都属于这个事务的一部分。 之后可以向服务器发送COMMIT语句来表明这个事务的所有语句都已经发送完了,服务器可以提交这个
阅读全文