当前位置: 首页 > wzjs >正文

网站建设需要微信账号和密码适合中考做的微机题网站

网站建设需要微信账号和密码,适合中考做的微机题网站,上海最新发布,陕西省住房建设部官方网站一建引言 在上篇中,我们基于spring boot整合redisson实现了分布式锁,接下来我会带领大家花一些时间来学习redisson如何实现各种锁,所以我们需要先从github上下载它的源码,本篇则先从可重入锁的相关实现开始来为大家做讲解。 加锁流程分…

引言

在上篇中,我们基于spring boot整合redisson实现了分布式锁,接下来我会带领大家花一些时间来学习redisson如何实现各种锁,所以我们需要先从github上下载它的源码,本篇则先从可重入锁的相关实现开始来为大家做讲解。

加锁流程分析

这里我们按照步骤逐步分析Redisson 可重入锁的加锁流程。

1.首先从入口方法开始 (RLock.lock()):

// RLock 接口的默认实现类 RedissonLock
public void lock() {try {lock(-1, null, false);} catch (InterruptedException e) {throw new IllegalStateException();}
}

2.核心加锁逻辑实现:

private void lock(long leaseTime, TimeUnit unit, boolean interruptibly) throws InterruptedException {// 获取当前线程IDlong threadId = Thread.currentThread().getId();// 尝试获取锁Long ttl = tryAcquire(leaseTime, unit, threadId);// 如果ttl为空,表示获取锁成功if (ttl == null) {return;}// 如果获取锁失败,订阅到对应的redisson锁channel,等待锁释放消息RFuture<RedissonLockEntry> subscribeFuture = subscribe(threadId);if (interruptibly) {subscribeFuture.syncUninterruptibly();} else {subscribeFuture.sync();}try {while (true) {// 再次尝试获取锁ttl = tryAcquire(leaseTime, unit, threadId);// 成功获取锁,直接返回if (ttl == null) {break;}// 等待锁释放通知if (ttl >= 0) {try {await(ttl, TimeUnit.MILLISECONDS);} catch (InterruptedException e) {if (interruptibly) {throw e;}}}}} finally {// 取消订阅unsubscribe(subscribeFuture, threadId);}
}

3.tryAcquire 方法实现(这里包含了可重入的核心逻辑):

private Long tryAcquire(long leaseTime, TimeUnit unit, long threadId) {// 根据传入的租约时间计算锁的过期时间long currentTime = System.currentTimeMillis();Long ttl = null;// 如果指定了租约时间if (leaseTime != -1) {ttl = tryLockInnerAsync(leaseTime, unit, threadId, RedisCommands.EVAL_LONG);} // 使用默认的过期时间else {ttl = tryLockInnerAsync(commandExecutor.getConnectionManager().getCfg().getLockWatchdogTimeout(), TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_LONG);// 启动看门狗定时续期scheduleExpirationRenewal(threadId);}return ttl;
}

梳理一下整个加锁流程:

1. 入口调用:

  • 用户调用 lock() 方法开始加锁
  • 默认使用无限等待时间,且不响应中断

2. 加锁尝试:

  • 首先获取当前线程 ID
  • 调用 tryAcquire 尝试获取锁
  • 如果获取成功(返回 null),则直接返回
  • 如果获取失败,进入等待流程

3. 锁等待流程:

  • 订阅锁释放的 Channel,等待通知
  • 进入循环,不断尝试获取锁
  • 获取成功则退出循环
  • 获取失败则等待指定时间后继续尝试

加锁Lua脚本分析

继续看tryLockInner方法 - 它是最核心的加锁 Lua 脚本:

<T> RFuture<T> tryLockInnerAsync(long leaseTime, TimeUnit unit, long threadId, RedisStrictCommand<T> command) {// 这里执行 Lua 脚本return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, command,// 判断锁是否存在"if (redis.call('exists', KEYS[1]) == 0) then " +// 不存在则创建锁,并设置重入次数为1"redis.call('hincrby', KEYS[1], ARGV[2], 1); " +"redis.call('pexpire', KEYS[1], ARGV[1]); " +"return nil; " +"end; " +// 锁已存在,判断是否是当前线程持有的锁"if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then " +// 是当前线程,则重入次数+1"redis.call('hincrby', KEYS[1], ARGV[2], 1); " +"redis.call('pexpire', KEYS[1], ARGV[1]); " +"return nil; " +"end; " +// 其他线程持有锁,返回锁的过期时间"return redis.call('pttl', KEYS[1]);",// 这里是参数Collections.singletonList(getName()), // KEYS[1] 锁名称unit.toMillis(leaseTime), // ARGV[1] 锁过期时间getLockName(threadId)); // ARGV[2] 线程标识
}

它的核心逻辑也很简单:首先检查锁是否存在,如果不存在,则直接加锁,且设置重入次数为1;如果存在,先检查是否是当前线程的锁,如果是,则重入次数+1,如果不是,则返回锁的剩余过期时间。

小结

本篇剖析了redisson可重入锁的加锁流程源码,其实这里读者应该可以发现我们前面通过redis手撸的时候的逻辑其实和这里几乎一致,这也是我们学习源码的意义,借鉴别人优秀的设计并为自己所用!


文章转载自:

http://UjYGxQLD.rrpbz.cn
http://hrrfvouT.rrpbz.cn
http://QzBAYewW.rrpbz.cn
http://43VXQT0p.rrpbz.cn
http://Bti7ZOZC.rrpbz.cn
http://CrRfyYM7.rrpbz.cn
http://DgqDmhOq.rrpbz.cn
http://iWNMrJpn.rrpbz.cn
http://2bAIVcKf.rrpbz.cn
http://VYv8SPU4.rrpbz.cn
http://lDDXx2aF.rrpbz.cn
http://cwroUsGm.rrpbz.cn
http://8n32OvZc.rrpbz.cn
http://VRhwd9D3.rrpbz.cn
http://vcIePyAr.rrpbz.cn
http://Ti7olJx8.rrpbz.cn
http://gsyCGScg.rrpbz.cn
http://SYYEKfbm.rrpbz.cn
http://Z0IOsEwA.rrpbz.cn
http://EgfGTwpB.rrpbz.cn
http://muzcQrrN.rrpbz.cn
http://drLVqGVn.rrpbz.cn
http://wSI9tN5W.rrpbz.cn
http://USdqCSYg.rrpbz.cn
http://uF70h2WQ.rrpbz.cn
http://NYLYW50d.rrpbz.cn
http://usLs8DBc.rrpbz.cn
http://XC5UAIZz.rrpbz.cn
http://L2o4NGRK.rrpbz.cn
http://smI31Sml.rrpbz.cn
http://www.dtcms.com/wzjs/722460.html

相关文章:

  • 响应式网站框架wordpress抓取设置
  • 珠海建站公司网站数据链接怎么做
  • 免费建设淘宝客网站邯郸手机建站价格
  • 微信彩票网站网站建设wordpress手机上打不开
  • 个人定制网站免费搭建购物网站
  • 网站自定义模块宁波网络公司在哪里
  • django 网站开发pxhere素材网站
  • 沈阳设计培训网站建设团员团干部如何登录到系统
  • 企业网站案列适合做浏览器主页的网站
  • 网站开发最流行的语言网站右下角代码
  • 整站优化仿站怎么修改成自己的网站
  • 赤峰是住房和城乡建设局网站洛可可设计公司待遇
  • dede淘宝客网站网站logo提交
  • 网站开发算是软件开发长宁区网站建设网站制
  • 非法网站开发是什么意思百度网站建设工资
  • 软文营销网站建筑模板厂
  • 网站建设报价兴田德润深圳网站制作品牌祥奔科技
  • 重庆专业网站建设首页排名做计量检定的网站
  • 手机做任务的网站有哪些云主机网站面板
  • 全球设计网站有哪些住房和城乡建设部网站监理工程师
  • wps免费模板网站自己做网站统计
  • 要建立网站凡科建站官网免费注册
  • 做商业网站品牌网线
  • 国际婚恋网站做翻译合法吗观山湖区网站建设
  • 怎们自己做网站门户网站 布局
  • 电脑上如何做网站宣传建e网室内设计网别墅
  • 网站优化外包服务未来中森网站建设价格
  • 黄埔网站建设价格广西住建局官方网站
  • flash html网站模板营口组织部网站 两学一做
  • 小狗做爰网站软件开发平台合同