
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
分布式编程开发相信大家在学习软件开发技术的时候都应该接触过这方面的知识吧,今天武汉达内IT培训就给大家简单介绍一下,java编程分布式锁的类型与应用分享。
1、为什么要有分布式锁?
JUC提供的锁机制,可以保证在同一个JVM进程中同一时刻只有一个线程执行操作逻辑;
多服务多节点的情况下,就意味着有多个JVM进程,要做到这样,就需要有一个中间人;
分布式锁就是用来保证在同一时刻,仅有一个JVM进程中的一个线程在执行操作逻辑;
换句话说,JUC的锁和分布式锁都是一种保护系统资源的措施。尽可能将并发带来的不确定性转换为同步的确定性;
2、分布式锁特性(五大特性非常重要)
特性1:互斥性。在任意时刻,只有一个客户端能持有锁。
特性2:不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
特性3:解铃还须系铃人。加锁和解锁必须是同一个客户端(线程),客户端自己不能把别人加的锁给解了。
特性4:可重入性。同一个现线程已经获取到锁,可再次获取到锁。
特性5:具有容错性。只要大部分的分布式锁节点正常运行,客户端就可以加锁和解锁。
2-1常见分布式锁的三种实现方式
1.数据库锁;2.基于ZooKeeper的分布式锁;3.基于Redis的分布式锁。
2-2本文我们主要聊redis实现分布式锁:
一个setnx就行了?value没意义?还有人认为incr也可以?再加个超时时间就行了?
3、分布式锁特性2之不会发生死锁
很多线程去上锁,谁锁成功谁就有权利执行操作逻辑,其他线程要么直接走抢锁失败的逻辑,要么自旋尝试抢锁;
3-2锁的超时时间该怎么计算?
刚才假设的超时时间1s是怎么计算的?这个时间该设多少合适呢?
锁中的业务逻辑的执行时间,一般是我们在测试环境进行多次测试,然后在压测环境多轮压测之后,比方说计算出平均的执行时间是200ms,锁的超时时间放大3-5倍,比如这里我们设置为1s,为啥要放大,因为如果锁的操作逻辑中有网络IO操作,线上的网络不会总一帆风顺,我们要给网络抖动留有缓冲时间。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。