redisson的锁的类型_你知道吗?大家都在使用Redisson实现分布式锁了!!

Redisson框架十分强大,基于Redisson框架可以实现几乎你能想到的所有类型的分布式锁。这里,我就列举几个类型的分布式锁,并各自给出一个示例程序来加深大家的理解。有关分布式锁的原理细节,后续专门撸一篇文章咱们慢慢聊!

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 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();

}

}

2.公平锁(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 res = fairLock.tryLockAsync(100, 10, TimeUnit.SECONDS);

3.联锁(MultiLock)

Redisson的RedissonMultiLock对象可以将多个RLock对象关联为一个联锁,每个RLock对象实例可以来自于不同的Redisson实例。

public void testMultiLock(RedissonClient redisson1,RedissonClient redisson2, RedissonClient redisson3){

RLock lock1 = redisson1.getLock("lock1");

RLock lock2 = redisson2.getLock("lock2");

RLock lock3 = redisson3.getLock("lock3");

RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);

try {

// 同时加锁:lock1 lock2 lock3, 所有的锁都上锁成功才算成功。

lock.lock();

// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁

boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

4.红锁(RedLock)

Redisson的RedissonRedLock对象实现了Redlock介绍的加锁算法。该对象也可以用来将多个RLock对象关联为一个红锁,每个RLock对象实例可以来自于不同的Redisson实例。

public void testRedLock(RedissonClient redisson1,RedissonClient redisson2, RedissonClient redisson3){

RLock lock1 = redisson1.getLock("lock1");

RLock lock2 = redisson2.getLock("lock2");

RLock lock3 = redisson3.getLock("lock3");

RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);

try {

// 同时加锁:lock1 lock2 lock3, 红锁在大部分节点上加锁成功就算成功。

lock.lock();

// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁

boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

5.读写锁(ReadWriteLock)

Redisson的分布式可重入读写锁RReadWriteLock,Java对象实现了java.util.concurrent.locks.ReadWriteLock接口。同时还支持自动过期解锁。该对象允许同时有多个读取锁,但是最多只能有一个写入锁。

RReadWriteLock rwlock = redisson.getLock("anyRWLock");

// 最常见的使用方法

rwlock.readLock().lock();

// 或

rwlock.writeLock().lock();

// 支持过期解锁功能

// 10秒钟以后自动解锁

// 无需调用unlock方法手动解锁

rwlock.readLock().lock(10, TimeUnit.SECONDS);

// 或

rwlock.writeLock().lock(10, TimeUnit.SECONDS);

// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁

boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS);

// 或

boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS);

...

lock.unlock();

6.信号量(Semaphore)

Redisson的分布式信号量(Semaphore)Java对象RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法。

RSemaphore semaphore = redisson.getSemaphore("semaphore");

semaphore.acquire();

//或

semaphore.acquireAsync();

semaphore.acquire(23);

semaphore.tryAcquire();

//或

semaphore.tryAcquireAsync();

semaphore.tryAcquire(23, TimeUnit.SECONDS);

//或

semaphore.tryAcquireAsync(23, TimeUnit.SECONDS);

semaphore.release(10);

semaphore.release();

//或

semaphore.releaseAsync();

7.可过期性信号量(PermitExpirableSemaphore)

Redisson的可过期性信号量(PermitExpirableSemaphore)实在RSemaphore对象的基础上,为每个信号增加了一个过期时间。每个信号可以通过独立的ID来辨识,释放时只能通过提交这个ID才能释放。

RPermitExpirableSemaphore semaphore = redisson.getPermitExpirableSemaphore("mySemaphore");

String permitId = semaphore.acquire();

// 获取一个信号,有效期只有2秒钟。

String permitId = semaphore.acquire(2, TimeUnit.SECONDS);

// ...

semaphore.release(permitId);

8.闭锁(CountDownLatch)

Redisson的分布式闭锁(CountDownLatch)Java对象RCountDownLatch采用了与java.util.concurrent.CountDownLatch相似的接口和用法。

RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");

latch.trySetCount(1);

latch.await();

// 在其他线程或其他JVM里

RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");

latch.countDown();

写在最后如果觉得文章对你有点帮助,请给小编一个转发+关注,后续会更新更多精彩的内容。

最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html动态散花代码,IOS实现签到特效(散花效果)的实例代码

本文讲述了IOS实现签到特效(散花效果)实例代码。分享给大家供大家参考,具体如下:散花特效#import /// 领取奖励成功interface RewardSuccess : NSObject/*** 成功动画*/ (void)show;end#import "RewardSuccess.h"#import "RewardSuccessW…

【牛客 - 280C】约数(数论,GCD,数学,分解因子)

题干: Actci上课睡了一觉,下课屁颠屁颠的去找数学老师补课,问了老师一个题目: 给出两个数a,b,问a和b的全部公约数是什么? 数学老师一看这道题太简单了,不屑回答,于是就交给了你…

小程序中input标签没有反应_鸢尾花预测:如何创建机器学习Web应用程序?

全文共2485字,预计学习时长12分钟图源:unsplash数据科学的生命周期主要包括数据收集、数据清理、探索性数据分析、模型构建和模型部署。作为数据科学家或机器学习工程师,能够部署数据科学项目非常重要,这有助于完成数据科学生命周…

潢川高中2021高考成绩查询,潢川高中2020年秋季学期高一期中考试成绩分析

潢川高中2020年秋季学期高一期中语文试卷分析分析人:李四海本次试卷结构与高考试卷结构一致,局部作了调整。如默写由6分增到10分,散文阅读由15分压到13分,文言文翻译共8分。经学科组集体讨论,作如下分析:一…

【牛客 - 280A】勘测(fib数列,思维,打表)

题干: Actci偶然发现了一个矿洞,这个矿洞的结构类似与一棵二叉树,Actci发现的矿洞恰好位于根节点处,为了尽快挖掘,Actci找来了她的小伙伴们来帮忙,由于地质原因,每天小伙伴们只能打通到一条到子…

win10安装ensp启动40_装系统不求人,快速制作启动U盘,傻瓜式重装WIN10

在以前如果我们的电脑系统损坏,无法进入WINDOWS系统,在需要重装WINDOWS系统时,一般的做法是,下载一个WINDOWS系统镜像,制作一个PE启动盘,在PE里安装系统镜像。这样传统的WINDOWS系统重装过程麻烦且耗时。而…

如何拆计算机主机箱,一种方便拆卸的计算机主机箱的制作方法

本发明涉及计算机设备技术领域,具体为一种方便拆卸的计算机主机箱。背景技术:计算机主机指计算机硬件系统中用于放置主板及其他主要部件的容器,通常包括CPU、内存、硬盘、光驱、电源、以及其他输入输出控制器和接口,如控制器、显卡…

*【牛客 - 326B】背单词(线性dp)

题干: winterzz1准备考4级了,现在winterzz1决定把世界上所有单词都背一遍,winterzz1发现任意一个单词最多有A个连续的元音,最多有B个连续的辅音。且单词最长长度为N,winterzz1问你在满打满算的情况他需要背多少单词&a…

java word转html 乱码 poi,java word转html poi

java word转html poi[2021-01-29 15:50:39] 简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐:…

教练,我想打ACM

又到了一年期末。。。慵懒中、、、不想复习、、、不想看课本也不想做题、、、不想听课也不想看笔记、、、、然而莫名想刷题??然而现在并不是刷题的时候啊、、、或许期末完了之后才是肝题的时候、、、然而现在就是什么都不想做啊、、难受。欠了很多套训练…

请写出sfr和sbit的语句格式_习题_C51语言答案

一、填空1.KeiL C51软件中,工程文件的扩展名是___UV2_______,编译连接后生成可烧写的文件扩展名是___HEX_________。2.C51支持的指针有一般指针和存储器指针。3.C51中,没有专门的循环语句,我们可…

未来计算机的功能猜想,全方位猜想,未来计算机发展详细预测

全方位猜想,未来计算机发展详细预测随着计算机技术的发展,PC将成为我们工作上的工具,生活中的控制中心是必然的事情。从网友的文章中,我们可以了解到计算机的未来充满了变数。性能的大幅度提高是不可置疑的,而实现性能…

【HDU - 5500】 Reorder the Books (思维)

题干: dxy has a collection of a series of books called "The Stories of SDOI",There are n(n≤19)n(n≤19) books in this series.Every book has a number from 11 to nn. dxy puts these books in a book stack with the order of their numbers …

github怎么切换到gitee_AOSP-RISCV 的开源仓库在 Gitee 上新建了镜像

前阵子在知乎上给大家介绍了我们在移植 AOSP 到 RISC-V 上的第一步: 汪辰:第一个 RISC-V 上的“Android 最小系统”​zhuanlan.zhihu.com目前所有的工作成果都是开源在 Github 上的,移植改动涉及的子仓库达到 9 个,所有源码下载下来达到 537M…

联想微型计算机拆,联想10064一体机拆机,联想一体机硬盘怎么拆

电脑现在在我们生活中有着非常广泛的用途,不论是我们的工作还是学习都离不开电脑的辅助。我们工作时可以用电脑进行记录档案资料,学习时可以用电脑查阅资料,及时解决一些学习上遇到的疑问。有了电脑之后我们的工作学习效率都得到了非常大的提…

微型计算机原理中断实验,微机原理实验---中断控制实验.doc

微机原理实验---中断控制实验深 圳 大 学 实 验 报 告课程名称: 微机计算机设计实验项目名称: 8259 中断控制实验学院: 信息工程学院专业: 电子信息工程指导教师:报告人: 学号: 2009100000班级&…

【CodeForces - 510D】Fox And Jumping(dp,stlmap,数论的性质)

题干: Fox Ciel is playing a game. In this game there is an infinite long tape with cells indexed by integers (positive, negative and zero). At the beginning she is standing at the cell 0. There are also n cards, each card has 2 attributes: len…

db2 linux 平台下迁移_Linux 下的 DB2数据库的迁移

前言:DB2 Universal Database™(DB2 UDB) 有一对非常有用的工具,可以帮助您实现这种跨平台的备份与恢复功能。 db2move 工具利用了 DB2 的数据移动工具(export 和 import 或 load)来移动数据库表。然而,由于数据库的内容远远不止于用户表&…

加拿大红河学院计算机专业,加拿大红河学院

加拿大红河学院是加拿大曼省最大的由曼省财政支持的公立高等专科学院,是曼省规模最大、课程最全面的学院,也是加拿大最大的学院之一。近年来,加拿大红河学院受到国人狂热追捧,申请人数逐年增长。加拿大红河学院专长于商业管理与国…

【CodeForces - 471C】MUH and House of Cards (思维,找规律)

题干: Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elephant Horace from the zoo of Kiev decided to build a house of cards. For that theyve already found a hefty deck of n playing cards. Lets describe the house they want t…