从构建分布式秒杀系统聊聊分布式锁
前言 最近懒成一坨屎,学不动系列一波接一波,大多还都是底层原理相关的。上周末抽时间重读了周志明大湿的 JVM 高效并发部分,每读一遍都有不同的感悟。路漫漫,借此,把前段时间搞着玩的秒杀案例中的分布式锁深入了解一下。 案例介绍 在尝试了解分布式锁之前,大家可以想象一下,什么场景下会使用分布式锁? 单机应用架构中,秒杀案例使用ReentrantLcok或者synchronized来达到秒杀商品互斥的目的。然而在分布式系统中,会存在多台机器并行去实现同一个功能。也就是说,在多进程中,如果还使用以上JDK提供的进程锁,来并发访问数据库资源就可能会出现商品超卖的情况。因此,需要我们来实现自己的分布式锁。 实现一个分布式锁应该具备的特性: 高可用、高性能的获取锁与释放锁 在分布式系统环境下,一个方法或者变量同一时间只能被一个线程操作 具备锁失效机制,网络中断或宕机无法释放锁时,锁必须被删除,防止死锁 具备阻塞锁特性,即没有获取到锁,则继续等待获取锁 具备非阻塞锁特性,即没有获取到锁,则直接返回获取锁失败 具备可重入特性,一个线程中可以多次获取同一把锁,比如一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁 在之前的秒杀案例中,我们曾介绍过关于分布式锁几种实现方式: 基于数据库实现分布式锁 基于 Redis 实现分布式锁 基于