Redis分布式锁
-
- 分布式锁的实现原理和不同方式的实现对比
- 基于Redis实现的分布式锁
集群架构下的并发问题
在单体架构上,乐观锁和悲观锁可以锁住并发情况下的同步代码块,我们多使用synchronized来对方法加锁。但是在配上负载均衡的集群模式下, 普通的synchronized是无法锁住从两台服务器同时进入的请求 。
这是在了解秒杀项目的难点之一: 一人一单的并发安全问题 在使用集群架构出现的难点。我们先从 单体项目 出发,单体项目很好理解,假如有俩线程:线程1查询订单,判断是否存在。然后第二个线程之后在去查询订单,判断是否存在,在synchronized的作用下两个线程是不会发生问题的。
那现在,我们不再是一台服务器,而是多台。在当前这一个JVM内部,锁的原理是在JVM内部维护了一个 锁监视器对象 ,监视器的对象用的是userId,它是在我们的 常量池 里面。那么在这个JVM内部是维护了这一个常量池子,当ID相同的情况下,他们永远都是同一个锁,也就是说锁的监视器是同一个。所以无论是线程1也好,线程2也好,他们俩要获取锁的时候,锁监视器就会记录线程ID,当另一个线程再来获取锁的时候肯定是不行的,因为锁监视器已经记录一个了。
但是,当