如何实现一个悲观锁

锁在编程中经常被用到。常用的锁主要有两种

  • 乐观锁
  • 悲观锁

乐观锁主要是基于版本号的实现。给数据加一个version字段基本可以实现

本文主要实现一个悲观锁

主要思路:

  • 维护一个内部的锁池
  • 当一个锁被占用时,其他地方获取锁将会失败

下面给出了JS版本的实现

const LockUtils = {
  lockPool: new Map(),//所有的锁
  acquire: function(lockName, timeout = 100){//传入key名称, 超时时间
    const that = this;
    end = new Date().getTime() + timeout;
    while(new Date().getTime() <= end){
      if(!that.lockPool.has(lockName)){
        that.lockPool.set(lockName, {
          name: lockName,
          meta: '上下文信息'
        })
        return {
          release: function(){//释放锁
            that.lockPool.delete(lockName);
          }
        }
      }
    }
    return undefined;
  }
}

用例

const lock = LockUtils.acquire('lock');//获取锁
const lock2 = LockUtils.acquire('lock');//锁被占用,获取失败
lock.release();//释放锁

你可能感兴趣的:(如何实现一个悲观锁)