线上死锁分析解决纪实

服务发生死锁,死锁检测时间较长,31s后死锁检测出来事务才得以回滚,期间不断有相同请求进来,造成死锁越来越复杂,并且服务端线程池中的所有线程都在等待锁,最后造成服务端线程池无空闲线程,拒绝服务。

注意:单条 SQL 也是一个事务,也会和其他事务发生死锁。

阅读全文〉

Aria2 GUI最佳实践

目前用的爽的下载工具,通过搭配 Chrome 和 自己写的一些脚本达到不输迅雷的用户体验。

本文在 MacOS 下可以通过所有步骤,其他平台需要自行修改相关步骤

阅读全文〉

BigDecimal 源码浅析

前几天做了刷一道 LeetCode,题目Multiply Strings - LeetCode大概就是输入两个 String 类型表示的数字,然后计算结果也用 String 表示,我一看,这,用 Java 的 BigDecimal 不是分分钟搞定,于是我就分分钟写完了结果,得到了一个不错的成绩,可以我转念一想,这肯定是投机取巧,用了 BigDecimal,那最起码也要知道它的原理吧,于是便有了这篇文章。

阅读全文〉

Java类加载器的准备和初始化

好久没有更新博客了,昨天在浏览微信公众号的时候看到了一道面试题,给出一个包含 main 方法的类,一些输出语句,让读者判断这些语句的输出顺序,其实也就是考察读者的对于 Java 类的初始化的顺序,看到这道题目的时候,我也就按照自己的理解得出了一个顺序,可是和答案却大相径庭,原因就在于对于 Java 类加载器在加载类时候的两个阶段:准备 初始化 没有足够的理解。今天我们在本文中就来聊聊类加载的这两个阶段

阅读全文〉

Spring 中 Transactional 注解原理

利用 Spring 框架可以很容易的使用注解的方式来使用事务,为我们的开发带来了巨大的便利,这种便利的实现是通过 Spring 本身的一系列机制来实现的,主要包含动态代理和 Spring Bean 的加载过程。本文将深入源码,揭开层层面纱…

阅读全文〉

幂等设计

我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。 例如

  1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果;
  2. 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱;
  3. 发送消息,也应该只发一次
  4. 创建业务订单,一次业务请求只能创建一个,创建多个就会出大问题等等很多重要的情况都需要幂等的特性来支持。
阅读全文〉

MySQL 中的锁

什么是事务?什么是隔离级别?
数据库中使用了多少种锁?这些锁之间有什么关系?
数据库如何在并发度和各种并发问题中平衡?

阅读全文〉

JVM-探究(五):读懂Java字节码

Java 文件最终会被编译成为 class 文件,无论多么复杂的 Java 程序最终都会在字节码中进行描述,因此字节码的描述能力应该是(事实上也是)Java 语言描述的超集,因此有很多其他语言也可以运行在 JVM 上,在这些语言中不缺少一些很“火”的语言。譬如:Groovy, JRuby, Jython, Clojure, Scala, Kotlin 等,这里不一一列述。有如此多的语言能够运行在 JVM 上,源于字节码强大的描述能力,本文首先介绍 Class 类的文件结构,然后通过文件结构进一步去解析 Class 类,我们甚至可以通过一些方式不修改源代码而去替换字节码中的部分字节,来实现动态的调整程序表现的目的。

阅读全文〉