1. 可重入锁(Reentrant Lock)
    Redisson的分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口,同时还支持自动过期解锁。
public void testReentrantLock(RedissonClient redisson){RLock lock = redisson.getLock("anyLock");try{// 1. 最常见的使用方法//lock.lock();// 2. 支持过期解锁功能,10秒钟以后自动解锁, 无需调用unlock方法手动解锁//lock.lock(10, TimeUnit.SECONDS);// 3. 尝试加锁,最多等待3秒,上锁以后10秒自动解锁boolean res = lock.tryLock(3, 10, TimeUnit.SECONDS);if(res){    //成功// do your business}} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}

Redisson同时还为分布式锁提供了异步执行的相关方法:

public void testAsyncReentrantLock(RedissonClient redisson){RLock lock = redisson.getLock("anyLock");try{lock.lockAsync();lock.lockAsync(10, TimeUnit.SECONDS);Future<Boolean> res = lock.tryLockAsync(3, 10, TimeUnit.SECONDS);if(res.get()){// do your business}} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();} finally {lock.unlock();}}
  1. 公平锁(Fair Lock)
    Redisson分布式可重入公平锁也是实现了java.util.concurrent.locks.Lock接口的一种RLock对象。在提供了自动过期解锁功能的同时,保证了当多个Redisson客户端线程同时请求加锁时,优先分配给先发出请求的线程。
public void testFairLock(RedissonClient redisson){RLock fairLock = redisson.getFairLock("anyLock");try{// 最常见的使用方法fairLock.lock();// 支持过期解锁功能, 10秒钟以后自动解锁,无需调用unlock方法手动解锁fairLock.lock(10, TimeUnit.SECONDS);// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁boolean res = fairLock.tryLock(100, 10, TimeUnit.SECONDS);} catch (InterruptedException e) {e.printStackTrace();} finally {fairLock.unlock();}}

Redisson同时还为分布式可重入公平锁提供了异步执行的相关方法:

RLock fairLock = redisson.getFairLock("anyLock");
fairLock.lockAsync();
fairLock.lockAsync(10, TimeUnit.SECONDS);
Future<Boolean> res = fairLock.tryLockAsync(100, 10, TimeUnit.SECONDS);
/** Copyright 2021 Wicrenet, Inc. All rights reserved.*/
package com.allianity.modules.cms.cache.impl;import com.allianity.common.learning.enums.RedisRouteKeyEnum;
import com.allianity.modules.cms.cache.UserCoursewareCache;
import org.redisson.api.RMapCache;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.LongCodec;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.Objects;
import java.util.concurrent.TimeUnit;/*** 【】** @author yangjunxiong* Created on 2021/1/14 11:42*/
@Component
public class UserCoursewareCacheImpl implements UserCoursewareCache {@Autowiredprivate RedissonClient redissonClient;@Overridepublic Boolean setUserCoursewareDuration(Long userId, Long s) {if (Objects.isNull(userId) || Objects.isNull(s)) {return false;}RMapCache<String, Long> mapCache = redissonClient.getMapCache(RedisRouteKeyEnum.T_USER_COURSEWARE_DURATION.getKey(), LongCodec.INSTANCE);mapCache.addAndGet(userId + "", s);mapCache.expire(RedisRouteKeyEnum.ACTIVITY_AUDIENCE_INFO.getTTL0(), TimeUnit.SECONDS);return true;}@Overridepublic Long getUserCoursewareDuration(Long userId) {RMapCache<String, Long> mapCache = redissonClient.getMapCache(RedisRouteKeyEnum.T_USER_COURSEWARE_DURATION.getKey(), LongCodec.INSTANCE);return mapCache.get(userId + "");}
}
/** Copyright 2020 Wicrenet, Inc. All rights reserved.*/
package com.allianity.modules.report.cache;import com.allianity.common.learning.enums.RedisRouteKeyEnum;
import com.allianity.modules.report.controller.model.CourseGroupRateReportQuery;
import com.allianity.modules.report.dto.CourseGroupRateBycgIdDTO;
import com.allianity.modules.report.dto.CourseGroupRateReportByDeptIdDTO;
import com.allianity.modules.report.dto.ReportUserDto;
import com.allianity.modules.report.service.impl.AbsCourseGroupRateReportServiceImpl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.joda.time.LocalDateTime;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;import java.util.Objects;
import java.util.concurrent.TimeUnit;/*** 【 任务完成率 缓存层 】** @author YJX* Created on 2020/12/7 18:02*/@Primary
@Service
@Qualifier("cache")
public class CourseGroupRateReportCacheServiceImpl extends AbsCourseGroupRateReportServiceImpl {@Autowiredprivate RedissonClient redissonClient;@Autowired@Qualifier("base")private AbsCourseGroupRateReportServiceImpl absCourseGroupRateReportService;@Overridepublic Page<CourseGroupRateReportByDeptIdDTO> pageingByDeptId(CourseGroupRateReportQuery query) {RBucket<Page<CourseGroupRateReportByDeptIdDTO>> bucket = redissonClient.getBucket(RedisRouteKeyEnum.API_REPORT_COURSE_GROUP_RATE.getKey() + ":" + query.getStatisticsType() + ":" + query.getDeptId() + ":" + query.getPage() + ":" + query.getLimit() +":" + LocalDateTime.now().toString("yyyy-M-d"));Page<CourseGroupRateReportByDeptIdDTO> page = bucket.get();if (Objects.isNull(page)) {page = this.absCourseGroupRateReportService.pageingByDeptId(query);bucket.set(page);bucket.expire(RedisRouteKeyEnum.API_REPORT_COURSE_GROUP_RATE.getTimeToLive(), TimeUnit.SECONDS);}return page;}
}
    private synchronized Boolean checkNub(String actId, String treeId) {TreeSaplingEntity one = this.treeSaplingService.getOne(new LambdaQueryWrapper<TreeSaplingEntity>().eq(TreeSaplingEntity::getActId, actId).eq(TreeSaplingEntity::getTreeId, treeId).eq(TreeSaplingEntity::getDelFlag, 0).eq(TreeSaplingEntity::getStatus, 1)//是否有效);//可领取总数Integer treeTotalNumber = one.getTreeTotalNumber();//redis处理超领事件RAtomicLong atomicLong = redissonClient.getAtomicLong(RedisRouteKeyEnum.TREE_ACTIVITY_TREE_ID_COUNT.getKey() + actId + "_" + treeId);long sum = atomicLong.get();if (sum == 0L) {//已领取数量sum = this.count(new LambdaQueryWrapper<TreeUserEntity>().eq(TreeUserEntity::getActId, actId).eq(TreeUserEntity::getTreeId, treeId).eq(TreeUserEntity::getDelFlag, 0));atomicLong.expire(RedisRouteKeyEnum.TREE_ACTIVITY_TREE_ID_COUNT.getTimeToLive(), TimeUnit.SECONDS);}Boolean a = sum < treeTotalNumber;if (a) {//自增加1sum = atomicLong.incrementAndGet();}return a;}

Redission 可重入锁(Reentrant Lock)公平锁(Fair Lock)相关推荐

  1. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  2. 线程调度、公平锁和非公平锁、乐观锁和悲观锁、锁优化、重入锁

    1. 线程调度 线程调度指的就是给线程分配使用处理器的过程.主要的调度方式有两种:协同式调度和抢占式调度. 1.1 协同式调度 线程完成自己的任务之后主动通知系统切换到另一个线程上. 优点: 实现简单 ...

  3. java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...

    一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...

  4. Juc07_乐观锁和悲观锁、公平锁和非公平锁、递归锁(可重入锁)、死锁及排查、自旋锁

    文章目录 ①. 乐观锁和悲观锁 ②. 公平锁和非公平锁 ③. 可重入锁(又名递归锁) ④. 死锁及排查 ⑥. 自旋锁 ①. 乐观锁和悲观锁 ①. 悲观锁(synchronized关键字和Lock的实现 ...

  5. java中的锁(悲观锁、乐观锁、可重入锁、不可重入锁、公平锁、非公平锁、自旋锁、阻塞锁...)

    Lock接口 1.简介.地位.作用 ① 锁是一种工具,用于控制对共享资源的访问 ② Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用和功能上又有较大的不 ...

  6. 可重入锁的理解及公平锁和非公平锁的具体实现

    可重入锁 首先结合以下两个例子理解以下可重入锁的概念. /*** 可重入锁:* 1.可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁.* 2.是指在同 ...

  7. JUC-9.“锁”事(显式锁与隐式锁/悲观锁与乐观锁/公平锁与非公平锁/可重入锁/读写锁(独占/共享/降级)/邮戳锁/死锁)、锁升级

    目录 一.悲观锁与乐观锁 1.1 悲观锁 1.2 乐观锁 二.公平锁与非公平锁 2.1 为什么会有公平锁/非公平锁的设计为什么默认非公平? 2.2 如何选择使用哪种锁? 三.可重入锁(又名递归锁) 3 ...

  8. 闲聊AQS面试和源码解读---可重入锁、LockSupport、CAS;从ReentrantLock源码来看公平锁与非公平锁、AQS到底是怎么用CLH队列来排队的?

    AQS原理可谓是JUC面试中的重灾区之一,今天我们就来一起看看AQS到底是什么? 这里我先整理了一些JUC面试最常问的问题? 1.Synchronized 相关问题以及可重入锁 ReentrantLo ...

  9. 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)

    线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...

  10. Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除

    文章目录 1. Java中的锁机制 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 可重入锁(递归锁) 1.5 读写锁 1.6 公平锁 1.7 非公平锁 1.8 共享锁 1.9 独占锁 1.1 ...

最新文章

  1. 电脑系统哪个最好用_什么除湿机好用_家用除湿机哪个牌子最好用-装修攻略
  2. Project2010的新特性
  3. android中sp的意义_两分钟理解Android中SP与DP的区别
  4. contenteditable属性让div也可以当做输入框
  5. 1、java中自己觉得重要的部分——未完待续
  6. java ArrayList扩容入门
  7. 浏览器对象模型bom的作用是什么?
  8. 【Linux】五分钟搞定 Linux 文档全部知识,就看这篇文章
  9. 后浪说不,是时代的进步
  10. 使用VB6.0编写管家婆服装----百胜服装ERP数据转换程序和通用SQL server查询程序的心得
  11. dz09手表刷android,DZ09手表MTK6260刷机包和工具
  12. 怎么看外文文献的影响因子_怎么看文章的影响因子?
  13. UE4 UI界面的层级切换
  14. word文档通配符换行_PDF如何转化成Word文档?
  15. 黑客是怎样入侵你的网站的
  16. [推荐]中国网管的知识宝库-网管之家
  17. 微信公众号开发(十)模板消息
  18. springboot中druid数据源配置无效的问题和jar包找不到问题
  19. 2023最详细的接口测试用例设计教程
  20. Java和大数据到底是什么关系?

热门文章

  1. Servlet学习笔记-Servlet工作原理和过程
  2. web安全测试之 xss攻击
  3. python PSNR代码
  4. textarea 赋值
  5. scikit - learn 做文本分类
  6. 从键盘输入正整数n,编程计算并输出1~n的和。
  7. OCR是什么?OCR技术特点介绍
  8. 调linux纯字符界面分辨率,linux下设置字符界面的分辨率(转)
  9. 修改Chrome/Edge浏览器编码方式
  10. #gcc笔记01#gcc编译选项 -O0 -O1 -O2 -O3