前言
随着公司业务的扩展,单实例逐渐都演变成的多实例,在多实例的情况下,怎么处理并发呢?
单实例加锁:synchronized关键字、Semaphore、ReentrantLock,或者我们也可以基于AQS定制化锁
多实例加锁:?
什么是分布式锁
单机部署的情况下,锁是在多线程之间共享的,但是分布式部署的情况下,是多台机器,应用级锁。也就是说锁是多进程之间共享的。那么分布式锁要保证锁资源的唯一性,可以在多进程之间共享。
分布式锁特性(互斥、可重入)
- 保证同一方法在某一时刻只能在一台机器里的一个进程中一个线程执行
- 保证锁可重入(避免死锁)
- 保证获取锁和释放锁的高可用
实现分布式锁的三种方式
数据库
乐观锁:在表结构中,设置一列版本号,每次更新数据,都会校验版本号,不一致则更新失败
场景:写比较少的场景,多读
悲观锁 :select ....... for update , 每次拿数据的时候都会加锁,其他人只能读,不能写
场景:多写场景
zookeeper