package com.jmdf.world;import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;/*** redis实现可重入锁,借助ThreadLocal*/
public class RedisWithReentrantLock {private ThreadLocal<Map> lockers = new ThreadLocal<>();private Jedis jedis;public RedisWithReentrantLock(Jedis jedis) {this.jedis = jedis;}private boolean _lock(String key) {return jedis.set(key, "", "nx", "ex", 5L) != null;}private void _unlock(String key) {jedis.del(key);}private Map<String, Integer> currentLockers() {Map<String, Integer> refs = lockers.get();if (refs != null) {return refs;}lockers.set(new HashMap<>());return lockers.get();}public boolean lock(String key) {Map refs = currentLockers();Integer refCnt = (Integer) refs.get(key);if (refCnt != null) {refs.put(key, refCnt + 1);return true;}boolean ok = this._lock(key);if (!ok) {return false;}refs.put(key, 1);return true;}public boolean unlock(String key) {Map refs = currentLockers();Integer refCnt = (Integer) refs.get(key);if (refCnt == null) {return false;}refCnt -= 1;if (refCnt > 0) {refs.put(key, refCnt);} else {refs.remove(key);this._unlock(key);}return true;}public static void main(String[] args) {Jedis jedis = new Jedis();RedisWithReentrantLock redis = new RedisWithReentrantLock(jedis);System.out.println(redis.lock("codehole"));System.out.println(redis.lock("codehole"));System.out.println(redis.unlock("codehole"));System.out.println(redis.unlock("codehole"));}
}

redis实现可重入锁相关推荐

  1. redis如何实现分布式重入锁

    redis如何实现分布式重入锁? 在上一节课中,我们已经知道SETNX是不支持重入锁的,但我们需要重入锁,怎么办呢? 目前对于redis的重入锁业界还是有很多解决方案的,最流行的就是采用Redisso ...

  2. Redis核心数据结构List应用场景-商品列表、缓存击穿、PV阅读量、抢红包、推送帖子、普通分布式锁、Redis可重入锁与红锁

    List应用场景 Redis之List 一. Redis list命令实战 二.商品列表 高并发的淘宝聚划算实现技术方案 SpringBoot+Redis实现商品列表功能 二.缓存击穿 什么是缓存击穿 ...

  3. Redis可重入锁的实现设计

    1 可重入锁的需求 单纯的 Redis 分布式锁仍然有些场景不满⾜的,如⼀个⽅法获取到锁后,可能在⽅法内继续调这个⽅法,就获取不到锁了.这时就要把锁改进成可重⼊锁. 重⼊锁,是以线程为单位,当⼀个线程 ...

  4. redis分布式锁之redisson可重入锁

    1.上篇讲了java里使用setNX实现redis分布式锁,可是这种方法还是有很多弊端的,追求完美的做法可以使用redisson来实现分布式锁,如下: 2.Redisson 是 java 的 Redi ...

  5. 年轻人,看看 Redisson 分布式锁—可重入锁吧!太重要了

    作者 | 李祥    责编 | 张文 来源 | 企鹅杏仁技术站(ID:xingren-tech) 引言 作为后端开发,对于所谓的线程安全.高并发等一系列名词肯定都不会陌生,相关的一些概念及技术框架是面 ...

  6. synchronized可重入锁

    什么是可重入锁?它有什么作用? 可重入锁,也叫做递归锁,指的是在同一线程内,外层函数获得锁之后,内层递归函数仍然可以获取到该锁. 说白了就是同一个线程再次进入同样代码时,可以再次拿到该锁. 它的作用是 ...

  7. 【面试 分布式锁详细解析】续命 自旋锁 看门狗 重入锁,加锁 续命 解锁 核心源码,lua脚本解析,具体代码和lua脚本如何实现

    Redisson实现分布式锁原理 自己实现锁续命 在 controller 里开一个 线程 (可以为 守护线程) 每10秒,判断一个 这个 UUID是否存在,如果 存在,重置为 30秒. 如果不存在, ...

  8. 基于 MySQL 排它锁实现分布式可重入锁解决方案

    一.MySQL 排它锁和共享锁 在进行实验前,先来了解下MySQL 的排它锁和共享锁,在 MySQL 中的锁分为表锁和行锁,在行锁中锁又分成了排它锁和共享锁两种类型. 1. 排它锁 排他锁又称为写锁, ...

  9. Redisson的使用与可重入锁

    目录 一.Redisson的使用 1.Redisson 2.导入依赖 3.建立Redssion配置类 4.使用 二.redisson的可重入锁 1.基本原理 2.test 3.图示 一.Redisso ...

最新文章

  1. 大数据在统计中的应用初探
  2. JUnit单元测试--IntelliJ IDEA
  3. QRadioButton Toggled() 使用方法
  4. brew install php55 报错 clang: error
  5. 练习_用if语句实现考试成绩划分
  6. AtCoder Beginner Contest 131 F - Must Be Rectangular!
  7. docker安装nextcloud(附nextcloud win7客户端下载教程)
  8. 深度学习笔记(21) 边缘检测
  9. bootstrap方法_中介效应中的bootstrap方法
  10. 小白初次攒机配置如何选择?
  11. C++构造函数与析构函数调用虚函数的注意事项
  12. 微服务分布式企业框架 Springmvc+mybatis+shiro+Dubbo+ZooKeeper
  13. Java设计模式pdf
  14. 太牛了! GitHub大牛呕心沥血整理的5000页Java学习手册文档
  15. win10诊断启动后联网_2步打开win10隐藏高级启动,解决80%系统问题
  16. java定义一个接口shape_定义一个借口shape
  17. 全球股市币市同迎黑色一天 熊市持现金或是王道 | 链塔快评
  18. 子元素自动撑开父元素空间
  19. 《Reducing Word Omission Errors in Neural Machine Translation:A Contrastive Learning Approach》论文阅读笔记
  20. 如何打造一个可躺赚的网盘项目,每天只需要2小时

热门文章

  1. iOS中的KeyChain的用途
  2. 【leetcode】Merge Sorted Array
  3. TF-Lite极简参考-环境搭建
  4. Dubbo即将毕业,晋升为Apache顶级项目?
  5. 又见黑科技!量子薄膜传感器或推动VR设备变革
  6. iOS精品源码,GHConsole图片浏览器圆形进度条音视频传输连击礼物弹出动画
  7. 韩国韩亚航空数万份乘客身份信息被泄露
  8. select、poll与epoll的优缺点
  9. SSH服务器能够允许root用户远程登录
  10. VMWare云计算初探