Home
Live In a Dream
Cancel

南洋五年记

漫长五年 五年前,我辞去了百度的工作,离开了家乡上海,踏上前往新加坡的班机。当时我怎么也没想到,我会留在新加坡了。 2018年我选择辞职去新加坡留学,很多人疑惑为什么选择新加坡。2023年,回过头来看,当年这看起来非主流的选择,真的改变了我太多。 重大抉择 2017年10月,我就在思考辞职留学的事情。背景原因也是多方面的,主要是感觉在百度继续工作对我的人生意义不大,想看看外面的世界。百度的...

GC Ergonomics间接引发的锁等待超时问题排查分析

1. 问题背景 上周线上某模块出现锁等待超时,如下图所示: 我虽然不是该模块负责人,但出于好奇,也一起帮忙排查定位问题。 这里的业务背景就是在执行到某个地方时,需要去表中插入一批数据,这批数据需要根据数据类型分配流水号。这与我的select for update引发死锁分析提到的流水号分配差不多:通过数据库悲观锁实现多实例部署的流水号生成与分配。 2. 问题排查 那么需要排查的问题很简...

Netty的FastThreadLocal实现源码解析

1. 概要 FastThreadLocal是Netty对JDK提供的ThreadLocal的一种改良替代实现。 2. 源码实现 直接进入源码实现品析环节。 理解FastThreadLocal需要看的源码涉及到以下几个类 FastThreadLocal UnpaddedInternalThreadLocalMap InternalThreadLocalMap的父类 Intern...

记录线上一次线程hang住问题

线上发现执行某特定任务在某个特定时间点后不再work。该任务由线程池中线程执行定时周期性调度,根据日志查看无任何异常。从代码研判应该无关定时任务框架,因为对提交的定时任务做了wrap,会将异常都catch住,保证下次仍然能够正常调度。 通过jstack导出堆栈信息,发现问题线程的堆栈信息如下: "OperatorDispatch" #338 prio=5 os_prio=0 tid=0x0...

WeakHashMap源码解读

1. 简介 本文基于JDK8u111的源码分析WeakHashMap的一些主要方法的实现。 2. 数据结构 就数据结构来说WeakHashMap与HashMap原理差不多,都是拉链法来解决哈希冲突。 下面是WeakHashMap中的Entry结构定义。 /** * 省略部分方法实现。 */ private static class Entry<K,V> extends ...

初探InnoDB MVCC源码实现

1. 背景 本文基于MySQL InnoDB源码对InnoDB中非锁定一致性读是如何实现的作一些简单的探究。 2. 基本概念 2.1 隐藏字段 在经典之作《高性能MySQL》的1.4节中提及了MySQL中MVCC的实现,原著中提及了 InnoDB implements MVCC by storing with each row two additional, hidden values...

select for update引发死锁分析

本文针对MySQL InnoDB中在Repeatable Read的隔离级别下使用select for update可能引发的死锁问题进行分析。 1. 业务案例 业务中需要对各种类型的实体进行编号,例如对于x类实体的编号可能是x201712120001,x201712120002,x201712120003类似于这样。可以观察到这类编号有两个部分组成:x+日期作为前缀,以及流水号(这里是四...

CyclicBarrier源码解读

1. 简介 JUC中的CyclicBarrier提供了一种多线程间的同步机制,可以让多个线程在barrier等待其它线程到达barrier。正如其名CyclicBarrier含义就是可以循环使用的屏障。 2. 源码解读 2.1 数据结构 2.1.1 Generation 在CyclicBarrier中用Generation来代表每一轮的Cyclibarrier的运行状况。 private ...

ConcurrentLinkedQueue源码解读

1.简介 ConcurrentLinkedQueue是JUC中的基于链表的无锁队列实现。本文将解读其源码实现。 2. 论文 ConcurrentLinkedQueue的实现是以Maged M. Michael和Michael L. Scott的论文Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue A...

Treiber Stack介绍

简介 Treiber Stack在 R. Kent Treiber在1986年的论文Systems Programming: Coping with Parallelism中首次出现。它是一种无锁并发栈,其无锁的特性是基于CAS原子操作实现的。 实现 下面给出的Java语言实现为《Java并发编程实战》一书的15.4.1小结中的实现。Treiber Stack的实现套路很简单,就是CAS+...