Skip to content

https://javaguide.cn/distributed-system/distributed-lock.html 内容冗余,没有重点,讲解混乱。 #2919

Description

@liiyunxi

[为什么需要分布式锁

在多线程环境中,如果多个线程同时访问并修改同一份共享资源(例如商品库存、外卖订单),且没有互斥、原子更新、乐观锁或唯一约束等保护,就可能出现数据不一致、重复处理、超卖等问题,影响程序的正确性和稳定性。

举个例子,假设现在有 100 个用户参与某个限时秒杀活动,每位用户限购 1 件商品,且商品的数量只有 3 个。如果不对共享资源进行互斥访问,就可能出现以下情况:

线程 1、2、3 等多个线程同时进入抢购方法,每个线程对应一个用户。
线程 1 和线程 2 分别代表两个不同用户,它们几乎同时读到库存还剩 1 件,于是都通过库存校验,继续创建订单、扣减库存。
线程 1 继续执行,将库存数量减少 1 个,然后返回成功。
线程 2 也继续执行,将库存数量减少 1 个,然后返回成功。
最终两个请求都成功,但库存只够卖 1 件,于是发生超卖。
这里的限购校验和库存扣减是两个不同的约束:限购主要解决同一用户重复购买的问题,库存扣减主要解决多个用户竞争同一份库存的问题。

我想知道为什么需要分布式锁,但是我看完了,才发现并没有讲清楚,甚至感觉极其的应付。

Image

这张图能讲清楚什么问题,只能让初学者以为不同JVM进程访问同一临界资源。实际上并非如此。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions