## 一、简介

单机锁:线程A操作互斥资源X时,线程B不可以操作。互斥资源的并行改成串行。 具体实现有:lock、synchronized等。 在服务分布式情况下,单机锁只能在当前机器上有效,比如一个订单服务有3台机器,这时候单机锁无法解决互斥资源的并发操作。需要引入分布式锁。比如redis。

二、如何实现锁

1、锁的场景/需求

场景: 当线程A抢占到互斥资源时,标记已抢占,线程B看到标记是已抢占则无法抢占,失败或排队,看到标记是未抢占则可以抢占 需求: 1、多线程执行互斥代码情况下,确保有且仅有一个线程能抢占互斥代码执行权限。 2、抢不到,予以失败或排队。

2、单机锁的实现原理

通过volatile修饰的lock锁的标记state字段(volatile解决可见性问题)再通过cas方式解决抢占的并发问题

3、redis分布式锁实现原理

1)标记,通过redis独有的key-value结构

当线程抢占到执行权限时,则设置key。

2)标记可见性,redis单线程命令

3)保证原子性,如:setnx

4、保证redis多指令的原子性

1)、事务

事务的特点以及场景: 命令是原子的 在执行事务中的指令时,服务器阻塞,不能执行其他指 令 不能拿到事务中间的指令的结果 来决定后面指令的逻辑。

2)、lua