分布式锁,进程锁,线程锁
概念
线程锁: 主要用来给方法和代码块来加锁,多个线程同时访问被加锁的方法或者代码块时,同一时间只有一个线程在执行,其他线程只能访问该对象中的非加锁代码块
进程锁: 为了控制操作系统中多个进程访问一个共享资源,可以使用本地系统的信号量控制
分布式锁: 当多个进程不在同一个系统中时,使用分布式锁控制多个进程对资源的访问
分布式锁的实现
分布式锁的实现总是要依赖第三方来存储锁的元数据信息。
- 数据库乐观锁
- 基于redis的分布式锁
- 基于zookeeper的分布式锁
redis的jedis.set(String key, String value, String nxxx, String expx, int time)命令可以保证原子性。
缓解数据库压力
客户端很多线程都要修改某行数据时,没有拿到锁的线程都会在数据库端机器上不断轮询,增大数据库的压力。
我们可以使用分布式锁,将对数据库行锁的等待获取的轮询放到每一个客户端机器上去实现,避免数据库端线程不断轮询。
常用分布式锁
redis使用内存缓存,在能够进行水平扩容的同时还能提高负载,面对高并发分布式锁读取数据的读写请求能够高速响应,还有aof,rdb以及哨兵机制可以防止某台服务器宕机导致数据丢失的情况。
zookeeper使用分布式一致算法paxos实现,可以轻松面对高负载,一台服务器宕机完全不用担心数据问题,附带监听机制,某个线程释放锁后,其他程序可以及时得到通知来获取对分布式锁的控制权。