前言
什么是锁?什么是分布式锁?它们之间有什么样的关系?
什么是锁
加锁(lock)是2018年公布的计算机科学技术名词,是指将控制变量置位,控制共享资源不能被其他线程访问。通过加锁,可以确保在同一时刻只有一个线程在访问被锁住的代码片段,我们在单机部署时可使用最简单的加锁完成资源的独享,如:
public class Program
{
private static readonly object Obj = new { };
public static void Main()
{
lock (obj)
{
//同一时刻只有一个线程可以访问
}
}
}
什么是分布式锁
但随着业务发展的需要,原单体单机部署的系统被部署成分布式集群系统后,原来的并发控制策略失效,为了解决这个问题就需要引入分布式锁,那分布式锁应该具备哪些条件?
- 原子性:在分布式环境下,一个方法在同一个时间点只能被一台机器下的一个线程所执行,防止数据资源的并发访问,避免数据不一致情况
- 高可用:具备自动失效机制,防止死锁,获取锁后如果出现错误,并且无法释放锁,则使用租约一段时间后自动释放锁
- 阻塞性:具备非阻塞锁特性(没有获取到锁时直接返回获取锁失败,不会长时间因等待锁导致阻塞)
- 高性能:高性能的获取锁与释放锁
- 可重入性:具备可重入特性,在同一线程外层函数获得锁之后,内层方法会自动获取锁
实现
分布式锁是特定于实现的,目前MasaFramework提供了两个实现,分别是Local
、Medallion
,下面会介绍如何配置并使用它们