RSS

Java分布式锁那点事


     
      分布式锁那点事为什么要使用分布式锁
     为了保证一个方法在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题。
     分布式锁的三种实现方式
     在分析分布式锁的三种实现方式之前,先了解一下分布式锁应该具备哪些条件。
     在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;
     高可用的获取锁与释放锁;
     高性能的获取锁与释放锁;
     具备可重入特性;
     具备锁失效机制,防止死锁;
     具备阻塞锁特性,即没有获取到锁将继续等待获取锁;
     具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。
     基于数据库的实现方式
     在数据库中创建一个表,表中包含方法名等字段,并在方法名字段上创建唯一索引,想要执行某个方法,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁。
     这种实现方式很简单,但是对于分布式锁应该具备的条件来说,它有一些问题需要解决及优化。
     因为是基于数据库实现的,数据库的可用性和性能将直接影响分布式锁的可用性及性能,所以,数据库需要双机部署、数据同步、主备切换;
     不具备可重入的特性,因为同一个线程在释放锁之前,行数据一直存在,无法再次成功插入数据,所以,需要在表中新增一列,用于记录当前获取到锁的机器和线程信息,在再次获取锁的时候,先查询表中机器和线程信息是否和当前机器和线程相同,若相同则直接获取锁;
     没有锁失效