开发人员很多时候会遇到在一个JVM实例内,多个线程要竞争使用具有排它性的共享资源,恰好JDK中提供了如synchronized 、 JUC包中的xxxLock 这些锁工具,使用它们可以方便我们实现对临界资源的互斥使用;使用锁是一种显式同步的方式,来控制线程间操作发生相对顺序的机制,除此之外其实还有另外一种隐式同步方式,即消息传递,但大家似乎对显式使用锁的方式更为熟悉一些。,现在的系统大多已演进为分布式的架构,如实例内多线程要互斥使用临界资源,分布式情况下多实例之间也存在需要排它的使用共享资源,这个问题就是分布式互斥问题。虽然大佬Lamport 在论文 《Time, clocks, and the ordering of events in a distributed system》中早就证明了使用状态机(如共识算法)就能够去中心化解决多进程互斥问题,但我们还是会更偏向使用分布式锁,原因大概有以下3点:,概括来说,分布式锁更轻便、更易用、也更节省资源。,使用分布式锁的目的主要有两种:,一个分布式锁应具备这样一些功能特点:,通过不同视角,可以从多维度充分了解各种分布式锁的实现差异,视角1:,视角2:,基于数据库实现的分布式锁:使用乐观锁、悲观锁或基于主键唯一约束来实现,基于分布式缓存实现分布式锁:Redis 和基于 Redis 的 RedLock(Redisson),基于分布式一致性算法实现的分布式锁:ZooKeeper、 Etcd,视角3:,Martin Kleppmann 在个人博客中发了一篇文章 How to do distributed locking,其中涉及了大量对 Redlock 算法安全性的质疑,Salvatore Sanfilippo(Redis 的创始人,也是这里 Redlock 算法的作者)随后发表 Is Redlock safe? 回应这些质疑;这两位大佬的对决一定要围观。,本文转载自微信公众号「架构染色」,可以通过以下二维码关注。转载本文请联系【架构染色】公众号作者。,
,
© 版权声明
文章版权归作者所有,未经允许请勿转载。