当前位置: 首页 > news >正文

分布式锁介绍

引言

分布式锁是一种用于协调不同进程或线程对共享资源的访问控制的机制。在分布式系统中,由于多个节点可能同时访问或修改同一资源,因此需要一个中心化的协调机制来确保资源的访问是有序的,避免数据不一致的问题。

分布式锁的特性:

互斥性

任意时刻,只有一个客户端能持有锁。

可重入性

同一个客户端可以多次获取同一把锁。

超时释放

持有锁的客户端在一定时间内没有主动释放锁,锁应该会被自动释放,防止死锁。

容错性

分布式锁服务要有容错机制,不会因为某个节点故障而导致锁失效。

实现方式

分布式锁有多种实现方式,以下列举了几种常见的实现方式及其在Java中的代码示例:

1. 基于Redis实现

利用Redis的setnx命令可以很容易地实现分布式锁。
2. 基于Zookeeper实现
利用Zookeeper的顺序临时节点和Watcher机制可以实现分布式锁。
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;

import java.util.concurrent.CountDownLatch;

public class ZookeeperDistributedLock implements Watcher {
private final ZooKeeper zk;
private final String lockPath;
private final CountDownLatch latch = new CountDownLatch(1);

public ZookeeperDistributedLock(ZooKeeper zk, String lockPath) {  this.zk = zk;  this.lockPath = lockPath;  
}  public void acquire() throws Exception {  if (zk.exists(lockPath, false) != null) {  zk.exists(lockPath, true, this);  latch.await();  } else {  zk.create(lockPath, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);  }  
}  @Override  
public void process(WatchedEvent event) {  if (event.getPath().equals(lockPath) && event.getType() == WatchedEvent.EventType.NodeDeleted) {  latch.countDown();  }  
}  public void release() throws Exception {  zk.delete(zk.getCurrentEphemeralNode(lockPath), -1);  
}  

}
使用示例:
以下是一个基于Redis实现的分布式锁的使用示例:
import redis.clients.jedis.Jedis;

public class DistributedLockExample {
public static void main(String[] args) {
// 初始化Redis连接
Jedis jedis = new Jedis(“localhost”, 6379);
复制代码
// 定义锁的名称和过期时间
String lockKey = “myLock”;
int expireTime = 10 * 1000; // 10秒

// 创建分布式锁对象  
RedisDistributedLock lock = new RedisDistributedLock(jedis, lockKey, expireTime);  try {  // 尝试获取锁  if (lock.tryLock()) {  try {  // 成功获取锁,执行临界区代码  System.out.println("Acquired lock, executing critical section...");  // 模拟耗时操作  Thread.sleep(5000);  } finally {  // 释放锁  lock.unlock();  }  } else {  // 获取锁失败,处理获取锁失败的逻辑  System.out.println("Failed to acquire lock, doing something else...");  }  
} catch (Exception e) {  e.printStackTrace();  
} finally {  // 关闭Redis连接  if (jedis != null) {  jedis.close();  }  
}  

}

http://www.lryc.cn/news/339147.html

相关文章:

  • Unity 获取RenderTexture像素颜色值
  • Tomcat以服务方式启动,无法访问网络共享目录问题
  • SVN的介绍
  • ZYNQ-700呼吸灯
  • UE5学习日记——制作多语言版本游戏,同时初步学习UI制作、多语言化、控制器配置、独立进程测试、打包配置和快速批量翻译等
  • 电脑重启后word文档空白或打不开,word无法自动修复,如何拯救
  • MVC和MVVM这两种设计模式的区别
  • 淘宝app端商品详情数据采集(商品价格,商品库存,商品销量,商品优惠券)
  • 第42篇:随机存取存储器(RAM)模块<一>
  • 在Java中实现记录1000万用户连续7天登录的功能,可以使用Redis的Bitmap来跟踪每个用户的登录状态
  • 深入探讨VIVE OpenXR:为Unity开发者的全面指南
  • 【Altium Designer 20 笔记】PCB线宽与过孔尺寸
  • 基于java的社区生活超市管理系统
  • 51单片机入门_江协科技_27~28_OB记录的自学笔记_AT24C02数据存储秒表
  • LeetCode-热题100:169. 多数元素
  • 汽车维修类中译英的英语翻译
  • java中的List,ArrayList和LinkedList集合
  • RESTful API与Web应用程序构建:原理与实践
  • 输了,腾讯golang一面凉了
  • 如何通过代码签名证书加强安全防护?
  • Docker速成:新手变专家!
  • numpy/arrayobject.h: No such file or directory
  • 前端大文件分块上传、断点续传
  • 使用新版FLIR (FLIR_ADAS_v2) 数据集创建yolo格式数据集(目标检测)
  • PHP发票查验接口未返回正确信息的原因、发票ocr识别接口
  • RA4000CE为汽车动力传动系统提供解决方案
  • 算法中的二阶差分
  • 第十五届蓝桥杯Java A组参赛总结
  • springCloudAlibaba集成seata实战(分布式事物详解)
  • VRTK/SteamVR手柄震动功能