package com.learn;//什么线程安全问题 在同一个jvm中,多个线程共享同一个全局变量做写的操作的时候,可能会收到其他线程的干扰。
class ThreadDemo implements Runnable {// synchronized 至适合于单个jvmprivate static int count;public synchronized void run() {count();}private synchronized void count() {try {Thread.sleep(15);} catch (Exception e) {// TODO: handle exception}count++;System.out.println(Thread.currentThread().getName() + ",count:" + count);}
}public class Test001 {public static void main(String[] args) {ThreadDemo threadDemo = new ThreadDemo();for (int i = 0; i < 100; i++) {Thread thread = new Thread(threadDemo);thread.start();}}
}
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.learn</groupId><artifactId>redis_lock</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency></dependencies></project>
package com.learn;import java.util.UUID;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;public class LockRedis {// redis线程池private JedisPool jedisPool;// 同时在redis上创建相同的一个key 相同key 名称private String redislockKey = "redis_lock";public LockRedis(JedisPool jedisPool) {this.jedisPool = jedisPool;}// redis 以key (redislockKey) 和value(随机不能够重复数字 锁的id)方式进行存储// redis实现分布式锁 有两个超时 时间问题/*** 两个超时时间含义:<br>* 1.在获取锁之前的超时时间----在尝试获取锁的时候,如果在规定的时间内还没有获取锁,直接放弃。<br>* 2.在获取锁之后的超时时间---当获取锁成功之后,对应的key 有对应有效期,对应的key 在规定时间内进行失效*//*** acquireTimeout* * @param acquireTimeout*            在获取锁之前的超时时间* @param timeOut*            在获取锁之后的超时时间*/// 基于redis实现分布式锁代码思路 核心方法 获取锁 、释放锁public String getRedisLock(Long acquireTimeout, Long timeOut) {Jedis conn = null;try {// 1.建立redis连接conn = jedisPool.getResource();// 2.定义 redis 对应key 的value值( uuid) 作用 释放锁 随机生成valueString identifierValue = UUID.randomUUID().toString();// 3.定义在获取锁之后的超时时间int expireLock = (int) (timeOut / 1000);// 以秒为单位// 4.定义在获取锁之前的超时时间// 5.使用循环机制 如果没有获取到锁,要在规定acquireTimeout时间 保证重复进行尝试获取锁(乐观锁)// 使用循环方式重试的获取锁Long endTime = System.currentTimeMillis() + acquireTimeout;while (System.currentTimeMillis() < endTime) {// 获取锁// 6.使用setnx命令插入对应的redislockKey ,如果返回为1 成功获取锁if (conn.setnx(redislockKey, identifierValue) == 1) {// 设置对应key的有效期conn.expire(redislockKey, expireLock);return identifierValue;}// 为什么获取锁之后,还要设置锁的超时时间 目的是为了防止死锁// zookeeper实现分布式锁通过什么方式 防止死锁 设置session 有效期}} catch (Exception e) {e.printStackTrace();} finally {if (conn != null) {conn.close();}}return null;}// 如果直接使用 conn.del(redislockKey); 保证对应是自己的创建redislockKey 删除对应自己的。// 释放redis锁public void unRedisLock(String identifierValue) {Jedis conn = null;// 1.建立redis连接conn = jedisPool.getResource();try {// 如果该锁的id 等于identifierValue 是同一把锁情况才可以删除if (conn.get(redislockKey).equals(identifierValue)) {System.out.println("释放锁..." + Thread.currentThread().getName() + ",identifierValue:" + identifierValue);conn.del(redislockKey);}} catch (Exception e) {} finally {if (conn != null) {conn.close();}}// 释放锁有两种 key自动有有效期// 整个程序执行完毕情况下,删除对应key}
}
package com.learn;import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public class LockService {private static JedisPool pool = null;static {JedisPoolConfig config = new JedisPoolConfig();// 设置最大连接数config.setMaxTotal(200);// 设置最大空闲数config.setMaxIdle(8);// 设置最大等待时间config.setMaxWaitMillis(1000 * 100);// 在borrow一个jedis实例时,是否需要验证,若为true,则所有jedis实例均是可用的config.setTestOnBorrow(true);pool = new JedisPool(config, "localhost", 6379, 3000, "123456");}private LockRedis lockRedis = new LockRedis(pool);// 演示redis实现分布式锁public void seckill() {// 1.获取锁String identifierValue = lockRedis.getRedisLock(5000l, 5000l);if (identifierValue == null) {System.out.println(Thread.currentThread().getName() + ",获取锁失败,原因因为获取锁时间超时...");return;}System.out.println(Thread.currentThread().getName() + ",获取锁成功,锁的id:" + identifierValue + ",正常执行业务了逻辑");// 2.释放锁lockRedis.unRedisLock(identifierValue);}
}
package com.learn;public class ThreadRedis extends Thread {private LockService lockService;public ThreadRedis(LockService lockService) {this.lockService = lockService;}@Overridepublic void run() {lockService.seckill();}}
package com.learn;public class Test002 {public static void main(String[] args) {LockService lockService = new LockService();for (int i = 0; i < 50; i++) {new ThreadRedis(lockService).start();}}}

Redis实现分布式锁释放锁相关推荐

  1. 《Redis官方文档》用Redis构建分布式锁

    <Redis官方文档>用Redis构建分布式锁 用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现 ...

  2. 《Redis官方文档》用Redis构建分布式锁(悲观锁)

    2019独角兽企业重金招聘Python工程师标准>>> **用Redis构建分布式锁 ** 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章 ...

  3. 基于 Redis 的分布式锁到底安全吗?

    [完整版] 网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词"Redis 分布式锁"随便到哪个搜索引擎上去搜索一下就知道了.这些文章的思路大体相近,给出的实现 ...

  4. js 拉勾网效果_Node.js 中实践基于 Redis 的分布式锁实现

    在一些分布式环境下.多线程并发编程中,如果对同一资源进行读写操作,避免不了的一个就是资源竞争问题,通过引入分布式锁这一概念,可以解决数据一致性问题. 作者简介:五月君,Nodejs Developer ...

  5. 基于Redis的分布式锁到底安全吗(上)?

    网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词"Redis 分布式锁"随便到哪个搜索引擎上去搜索一下就知道了.这些文章的思路大体相近,给出的实现算法也看似合 ...

  6. Redis构建分布式锁——Redlock

    本文来自:http://ifeve.com/redis-lock/ 简介 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁 ...

  7. java分布式锁工具类_java 通过redis实现分布式锁

    1. 开局 在多线程环境中,经常会碰到需要加锁的情况,由于现在的系统基本都是集群分布式部署,JVM的lock已经不能满足分布式要求,分布式锁就这样产生了... 百度一下,网上有很多分布式锁的方案或者例 ...

  8. Redis:使用Redis的分布式锁

    在许多环境中不同进程必须以互斥方式使用共享资源进行操作时,分布式锁是非常有用的原语. 有许多库和博客文章描述了如何使用Redis实现DLM(分布式锁管理器)(Distributed Lock Mana ...

  9. Redlock 算法:Redis 实现分布式锁(译)

    先介绍两个概念 Safety Properties, 在程序运行中不会进入非预期的状态(如非法调用参数, 数组下标越界等运行错误) Liveness Properties, 在程序运行中预期状态一定会 ...

最新文章

  1. 学习 TTreeView [15] - 连接数据库 (作为给 丁永其 和 DELPHI万岁 两位朋友的回复)...
  2. MPEG-7 视觉描述符
  3. python all()函数 (判断可迭代对象中是否全为True)
  4. 一篇文章把Self-Attention与Transformer讲明白
  5. AV1为何有信心打败H.265?
  6. 1.15运行命令直至执行成功
  7. MDX中Filter 与Exist的区别
  8. redhat7.3安装yum源 基于外网的http服务
  9. 【medium】220. Contains Duplicate III
  10. String reverse方法
  11. 神经网络测试集loss不变_神经网络训练过程中不收敛或者训练失败的原因
  12. 商业智能BI的特点及发展
  13. PSIFT:Pore Scale-invariant feature transform;毛孔尺度不变特征点
  14. 女装网 www.nzw.com.cn
  15. 移动智能与终端安全防护
  16. 高中数学40分怎么办_高中数学不好怎么办
  17. 微信小程序——【云音乐播放器】
  18. 川普哭诉“推特狂掉粉”,将用行政命令监管硅谷?
  19. Cobalt Strike(cs神器)简洁功能介绍、被控端常见执行命令
  20. 算法——递推算法(顺推、逆推)

热门文章

  1. 一些基本数据类型的类封装(包装类)
  2. JAVA学习笔记-“Hello World”
  3. Git常用命令备忘(一) 转载
  4. Android—常用组件练习
  5. SQL Server 影响dbcc checkdb的 8 种因素
  6. 2012_Houdini_ShowReel.
  7. “许巍日”新歌提前曝光 《爱如少年》10/15温暖登场!
  8. 阿里1682亿背后的协同研发云——云效公共云正式商业化
  9. 脑芯编:窥脑究竟,织网造芯(二)
  10. easyui tab