Zookeeper实现分布式互斥锁

ZooKeeper : Curator框架之分布式锁InterProcessReadWriteLock InterProcessReadWriteLock 跨JVM工作的可重入读/写互斥锁,使用Zookeeper来持有锁,所有JVM中使用相同锁路径的所有进程都将实现进程间临界区。这个互斥锁是公平的,每个用户都会按照请求的顺序获得互斥锁(从ZK的角度来看)。 读写锁维护一对关联的锁,一个用于只读操作,一个用于写操作。只要没有写锁,读锁可以被多个用户同时持有,而写锁是独占的。 读写锁允许从写锁降级为读锁,方法是先获取写锁,然后就可以获取读锁。但是,无法从读锁升级到写锁。 测试 pom.xml: <?xml 阅读详情

一、分布式互斥锁


   分布式锁主要用来在分布式系统中同步共享资源的访问,在zookeeper中,并没有像JAVA里一样有Synchronized或者是ReentrantLock机制来实现锁机制,但是在zookeeper中,实现起来更简单:
  我们可以讲将zk的一个数据节点代表一个锁,当多个客户端同时调用create()节点创建节点的时候,zookeeper会保证只会有一个客户端创建成功,那么我们就可以让这个创建成功的客户端让其持有锁,而其它的客户端则注册Watcher监听,当持有锁的客户端释放锁后,监听的客户端就会收到Watcher通知,然后再去试图获取锁,这样反复即可。

 
二、代码示例


  下面的代码只是实现了基本的功能,没有考虑程序的健壮性,比如异常的处理。

import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

/**
 * 基于zookeeper实现互斥锁
 *
 * @author tanjie
 *
 */
public class DistributedClient {

    private static final int SESSION_TIMEOUT = 5000;

    private String hosts = "zkhost:ip";

    private String groupNode = "locks";

    private String subNode = "sub";

    private ZooKeeper zk;

    // 当前client创建的子节点
    private volatile String thisPath;

    // 当前client等待的子节点
    private volatile String waitPath;

    private CountDownLatch latch = new CountDownLatch(1);

    /**
     * 连接zookeeper
     *
     * @param countDownLatch
     */
    public void connectZookeeper(final CountDownLatch countDownLatch)
            throws Exception {
        zk = new ZooKeeper(hosts, SESSION_TIMEOUT, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                try {
                    if (event.getState() == KeeperState.SyncConnected) {
                        latch.countDown();
                    }

                    // 发生了waitPath的删除事件
                    /**
                     * 假设某个client在获得锁之前挂掉了, 由于client创建的节点是ephemeral类型的,
                     * 因此这个节点也会被删除, 从而导致排在这个client之后的client提前获得了锁.
                     * 此时会存在多个client同时访问共享资源. 如何解决这个问题呢? 可以在接到删除通知的时候,
                     * 进行一次确认, 确认当前的thisPath是否真的是列表中最小的节点.
                     */
                    if (event.getType() == EventType.NodeDeleted
                            && event.getPath().equals(waitPath)) {
                        // 确认thisPath是否真的是列表中的最小节点
                        List<String> childrenNodes = zk.getChildren("/"
                                + groupNode, false);
                        String thisNode = thisPath
                                .substring(("/" + groupNode + "/").length());
                        // 排序
                        Collections.sort(childrenNodes);
                        int index = childrenNodes.indexOf(thisNode);
                        if (index == 0) {
                            // 确实是最小节点
                            doSomething(countDownLatch);
                        } else {
                            // 说明waitPath是由于出现异常而挂掉的
                            // 更新waitPath
                            waitPath = "/" + groupNode + "/"
                                    + childrenNodes.get(index - 1);
                            // 重新注册监听, 并判断此时waitPath是否已删除
                            if (zk.exists(waitPath, true) == null) {
                                doSomething(countDownLatch);
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        // 等待连接建立
        latch.await();
        if (null != zk) {
            Stat stat = zk.exists("/" + groupNode, false);
            if (null == stat) {
                zk.create("/" + groupNode, null, Ids.OPEN_ACL_UNSAFE,
                        CreateMode.PERSISTENT);
            }
        }
        // 创建子节点
        thisPath = zk.create("/" + groupNode + "/" + subNode, null,
                Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
        Thread.sleep(10);
        List<String> childrenNodes = zk.getChildren("/" + groupNode, false);
        // 列表中只有一个子节点, 那肯定就是thisPath, 说明client获得锁
        if (childrenNodes.size() == 1) {
            doSomething(countDownLatch);
        } else {
            String thisNode = thisPath.substring(("/" + groupNode + "/")
                    .length());
            Collections.sort(childrenNodes);
            int index = childrenNodes.indexOf(thisNode);
            if (index == 0) {
                // index == 0, 说明thisNode在列表中最小, 当前client获得锁
                doSomething(countDownLatch);
            } else {
                // 获得排名比thisPath前1位的节点
                this.waitPath = "/" + groupNode + "/"
                        + childrenNodes.get(index - 1);
                // 在waitPath上注册监听器, 当waitPath被删除时, zookeeper会回调监听器的process方法
                zk.getData(waitPath, true, new Stat());
            }
        }
    }

    private void doSomething(CountDownLatch countDownLatch) throws Exception {
        try {
            System.out.println("当前线程:" + Thread.currentThread().getName()
                    + "获得了锁:" + thisPath);
            //模拟获得锁的线程执行相应逻辑
            Thread.sleep(2000);
        } finally {
            System.out.println("当前线程:" + Thread.currentThread().getName()
                    + "已经释放了锁,让其它客户端有机会去获取," + thisPath);
            // 将thisPath删除, 监听thisPath的client将获得通知,相当于释放锁
            zk.delete(this.thisPath, -1);
            countDownLatch.countDown();
            zk.close();
        }
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(20);
        final CountDownLatch latch = new CountDownLatch(20);
        for (int i = 0; i < 20; i++) {
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        DistributedClient lock = new DistributedClient();
                        lock.connectZookeeper(latch);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (null != executorService) {
                executorService.shutdown();
            }
        }
    }
}

   可能的运行结果如下:

当前线程:pool-1-thread-16获得了锁:/locks/sub0000000053
当前线程:pool-1-thread-16已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000053
当前线程:pool-1-thread-20-EventThread获得了锁:/locks/sub0000000054
当前线程:pool-1-thread-20-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000054
当前线程:pool-1-thread-5-EventThread获得了锁:/locks/sub0000000055
当前线程:pool-1-thread-5-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000055
当前线程:pool-1-thread-2-EventThread获得了锁:/locks/sub0000000056
当前线程:pool-1-thread-2-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000056
当前线程:pool-1-thread-6-EventThread获得了锁:/locks/sub0000000057
当前线程:pool-1-thread-6-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000057
当前线程:pool-1-thread-10-EventThread获得了锁:/locks/sub0000000058
当前线程:pool-1-thread-10-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000058
当前线程:pool-1-thread-3-EventThread获得了锁:/locks/sub0000000059
当前线程:pool-1-thread-3-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000059
当前线程:pool-1-thread-11-EventThread获得了锁:/locks/sub0000000060
当前线程:pool-1-thread-11-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000060
当前线程:pool-1-thread-7-EventThread获得了锁:/locks/sub0000000061
当前线程:pool-1-thread-7-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000061
当前线程:pool-1-thread-13-EventThread获得了锁:/locks/sub0000000062
当前线程:pool-1-thread-13-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000062
当前线程:pool-1-thread-15-EventThread获得了锁:/locks/sub0000000063
当前线程:pool-1-thread-15-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000063
当前线程:pool-1-thread-1-EventThread获得了锁:/locks/sub0000000064
当前线程:pool-1-thread-1-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000064
当前线程:pool-1-thread-18-EventThread获得了锁:/locks/sub0000000065
当前线程:pool-1-thread-18-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000065
当前线程:pool-1-thread-4-EventThread获得了锁:/locks/sub0000000066
当前线程:pool-1-thread-4-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000066
当前线程:pool-1-thread-19-EventThread获得了锁:/locks/sub0000000067
当前线程:pool-1-thread-19-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000067
当前线程:pool-1-thread-14-EventThread获得了锁:/locks/sub0000000068
当前线程:pool-1-thread-14-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000068
当前线程:pool-1-thread-9-EventThread获得了锁:/locks/sub0000000069
当前线程:pool-1-thread-9-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000069
当前线程:pool-1-thread-8-EventThread获得了锁:/locks/sub0000000070
当前线程:pool-1-thread-8-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000070
当前线程:pool-1-thread-12-EventThread获得了锁:/locks/sub0000000071
当前线程:pool-1-thread-12-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000071
当前线程:pool-1-thread-17-EventThread获得了锁:/locks/sub0000000072
当前线程:pool-1-thread-17-EventThread已经释放了锁,让其它客户端有机会去获取,/locks/sub0000000072

ZooKeeper : Curator框架之分布式锁InterProcessMutex InterProcessMutex InterProcessMutex类的源码注释: A re-entrant mutex that works across JVMs. Uses Zookeeper to hold the lock. All processes in all JVMs that use the same lock path will achieve an inter-process critical section. Further, this mutex is “fair” - ea 阅读详情

相关推荐

STM32+OpenCV云台PID调参实战:从震荡到丝滑跟踪的进阶之路

本文详细介绍了基于STM32和OpenCV的跟踪云台PID调参实战经验。从硬件搭建、PID控制原理到调参技巧,系统讲解了如何通过调整比例、积分和微分参数解决系统震荡问题,实现从震荡到丝滑跟踪的进阶过程,特别适合电赛和嵌入式视觉控制开发者参考。

tgb3456789的博客 716

ZK(ZooKeeper)分布式锁实现

在平时我们对锁的使用,在针对单个服务,我们可以用 Java 自带的一些锁来实现,资源的顺序访问,但是随着业务的发展,现在基本上公司的服务都是多个,单纯的 Lock或者Synchronize 只能解决单个JVM线程的问题,那么针对于单个服务的 Java 的锁是无法满足我们业务的需要的,为了解决多个服务跨服务访问共享资源,于是就有了分布锁,分布式锁产生的原因就是集群。...

fygkchina的专栏 3752

STM32驱动数码管:从硬件连接到动态显示实现

本文详细介绍了使用STM32单片机驱动数码管的完整流程,从硬件连接到软件实现。内容涵盖共阳/共阴数码管原理、GPIO配置、段码表生成,并重点解析了多位数码管动态显示的核心技术,包括动态扫描原理、消影处理及实战代码,帮助开发者快速掌握这一嵌入式开发基础技能。

p5l2m9n4o6q的博客 575

基于zookeeper实现分布式锁

一、分布式锁介绍 分布式锁主要用于在分布式环境中保护跨进程、跨主机、跨网络的共享资源实现互斥访问,以达到保证数据的一致性。 二、架构介绍 在介绍使用Zookeeper实现分布式锁之前,首先看当前的系统架构图 三、分布式锁获取思路1.获取分布式锁的总体思路在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候删除该临时节点。客户端调用createNode方法在locker

极客神殿 1197

分布式定时任务(XXL-JOB)整合达梦数据库 带源码

背景 1. 因公司需要可视化管理配置调度任务,查询项目选择XXL-JOB,它是开源项目,入手很简单,详情可以参考官方文档; 2. 因项目的机密性,选择数据库为国内知名的达梦数据库7,与Java项目的整合详情可以参考SpringBoot 集成 达梦数据库 maven依赖本地jar包; 3. 因XXL-JOB暂时没有找到集成达梦数据库的案例,博主自己整合DM7踩过很多的坑,特此整合一个简单可直接...

艾斯-李的博客 3815

3D视觉引导技术在机器人焊接中的应用

通过对比传统的2D视觉和3D视觉技术在焊接领域的应用差异,探讨了3D视觉引导技术在提高焊接精度、适应不规则工件形状和增强自适应能力方面的优势。本文对3D视觉引导技术在机器人焊接中的应用进行了深入探讨,总结了其在提高焊接精度、适应不规则工件形状和增强自适应能力方面的优势,并通过应用案例展示了其在焊接路径规划、焊缝检测和焊接质量控制等方面的重要作用。1. 提高焊接精度:3D视觉引导技术能够精确测量焊接工件的三维形状和位置,为机器人提供精准的焊接路径规划和跟踪,从而提高焊接精度。三、3D视觉引导技术概述。

2302_79273122的博客 1836

分布式锁--Redis秒杀(互斥锁)(一)

一、业务场景 中秋佳节,进行月饼秒杀,特价,限量1000份,不限每人秒的份数,不要超卖即可。 二、SetNX实现 1. 分布式锁SetNX实现 RedisLock.java /** * redis 分布式锁 */ @Component @Slf4j public class RedisLock { @Autowired private RedisTemplate redisTemplate; /** * 加锁 * @param key produ

huhusuiyue的博客 1147

GPU服务器选购避坑指南:从硬件配置到场景化性能调优

本文提供GPU服务器选购的全面指南,涵盖硬件架构解析、应用场景配置策略和性能调优实践。针对大模型训练、推理服务和科学计算等场景,详细分析GPU选型、内存带宽匹配和散热设计等关键因素,帮助技术决策者避免常见配置误区,实现成本效益最大化。

peace的博客 1030

Zookeeper分布式锁分类

Zookeeper分布式锁分类1、互斥锁1.1、非公平锁1.2、公平锁2、共享锁 Zookeeper的锁一共分为两种,一个是互斥锁,一个是共享锁,然而互斥锁又分为公平锁和非公平锁,接下来详解一下这几个锁。 1、互斥锁 同一时间只能有一个请求占有,无论这个请求是读请求还是写请求,这就叫互斥锁。 1.1、非公平锁 如上图所示,就是一个非公平锁,我们会发现一个资源只能被一个线程所占有,当有另外的线程需要获取该资源时,就必须要监听等待,当占有该资源的线程释放了该资源之后,其它线程才可以开始去争夺该资源。

qq_41931364的博客 767

uni-app - 文本展开 / 收起折叠功能,支持自定义样式(当文本内容超出规定行数后,展开收起折叠的功能)兼容 H5 / App / 小程序且易用更容易修改的插件组件源码,超详细的示例代码及注释

uniapp实现文本的展开与收起功能,uniapp展开全部和收起,uniapp里文本的展开与收起,uniapp中文本内容超出规定行数后展开收起的处理,UNIAPP兼容h5、微信小程序多行文本展开或收起,uni-app中,文字超出隐藏并显示省略号(实现展开、收起全文),uni-app中文本过长-实现折叠与展开效果,中文本内容超出规定行数(字数)后展开收起的处理,超出部分...显示,uniapp适用于uniapp多行文本溢出显示...,多行文本展开或收起,uni-app-文本展开/收起折叠功能,支

🏆 前端领域优质创作者 5642

Wi-Fi数据帧类别

QoS

1042484520@qq.com(邮箱) 3156

MIT 6.824 Lec8 Zookeeper

ZooKeeper拟解决的问题 能否将分布式系统中的不同的协作服务进行统一? 如何设计统一的API接口? 上层应用该如何使用? 为了系统的容错性,我们需要搭建N个副本机器,我们能否同样获得N倍的性能提升? Raft机制下的性能问题 理想情况下,在分布式系统中,我们希望可以通过水平扩展集群规模来增加提升系统性能。然而,在Raft机制下水平扩展甚至会降低系统的性能。 在Raft机制下,所有的操作都需要通过Leader来进行处理,因此Leader才是影响系统性能的瓶颈节点。 ZooKeeper性能解决方案 读

weixin_46840831的博客 1477

Codex入门19-数据库操作(解放双手:用自然语言写SQL、建表和数据迁移)

写 SQL 是后端开发的日常,但复杂的 JOIN、子查询、窗口函数总让人头疼。本文教你用 Codex CLI 实现:自然语言直接生成 CREATE TABLE、复杂 SQL 查询、数据库迁移脚本(Prisma/Knex/Alembic)、ORM 模型代码(SQLAlchemy/TypeORM)、甚至自动生成数据库文档。重点强调安全红线——永远不要让 AI 直接连接生产数据库。从需求描述到完整数据库层代码,一篇搞定。

yueyeguzhuo的专栏 234

基于Zookeeper实现的分布式互斥锁 - InterProcessMutex

Curator是ZooKeeper的一个客户端框架,其中封装了分布式互斥锁的实现,最为常用的是InterProcessMutex,本文将对其进行代码剖析 简介 InterProcessMutex基于Zookeeper实现了分布式的公平可重入互斥锁,类似于单个JVM进程内的ReentrantLock(fair=true) 构造函数 123456789101112131...

weixin_30823833的博客 363

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ZooKeeper 分布式锁 Curator 源码 04:分布式信号量和互斥锁

前言从安小说网 https://www.sixu.info 分布式信号量,之前在 Redisson 中也介绍过,Redisson 的信号量是将计数维护在 Redis 中的,那现在来看一下 Curator 是如何基于 ZooKeeper 实现信号量的。 使用 Demo public class CuratorDemo { public static void main(String[] args) throws Exception { String connectString =.

weixin_57699483的博客 235

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python分布式项目_开源项目之python使用etcd构造分布式互斥锁

前几天跟朋友聊了下分布式互斥锁的事,我以前用过redis和zookeeper做分布式的互斥锁,但那哥们的场景下已经用了etcd,不再想引入其他的服务。 其实etcd本身也可以做成分布式互斥锁的。在coreos关于etcd文章的介绍里,就标记出etcd适合做分布式锁的特性…在我想来,多个客户端去请求锁或则是设置锁的时候,只要能保证 exist 和 write 是一组原子操作就可以了,只需要数据库本身...

weixin_39746869的博客 357

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

分布式互斥锁之Redis实现

转载自https://blog.youkuaiyun.com/xiaolyuh123/article/details/78551345 分布式锁的解决方式 1.基于数据库表做乐观锁,用于分布式锁。(适用于小并发) 2.使用memcached的add()方法,用于分布式锁。 3.使用memcached的cas()方法,用于分布式锁。(不常用) 4.使用redis的setnx()、expire()方法,用于分...

ystyaoshengting的专栏 1754

zookeeper 分布式锁_Zookeeper分布式入门——ZK分布式锁的简单实现

使用InterProcessMutex实现InterProcessMutex基于Zookeeper实现了分布式的公平可重入互斥锁,类似于单个JVM进程内的ReentrantLock1.初始化InterProcessMutexprivate static InterProcessMutex mutex = new InterProcessMutex(client, "/curator/lock");...

weixin_39622628的博客 154

ZooKeeper分布式锁实战:从互斥锁到读写锁与栅栏的终极方案解析

随着互联网技术的飞速发展,分布式系统已成为支撑现代高并发、高可用业务场景的核心架构。无论是电商平台的秒杀活动、金融系统的交易处理,还是云计算中的资源调度,分布式系统通过将任务分散到多台机器上协同工作,显著提升了系统的处理能力和可靠性。然而,分布式环境也带来了单机系统未曾面临的挑战,其中最为关键的是数据一致性和并发控制问题。在分布式系统中,多个节点可能同时访问和修改共享资源,如果没有有效的协调机制,就会导致数据不一致、资源竞争甚至系统崩溃。

zuiyuelong的博客 990

2024年最新图解curator如何实现zookeeper分布式锁_curator 锁(1)

attemptLock()方法有三个入参:long类型的time 和 TimeUnit类型的 unit 共同表示尝试加锁的超时时间,字节数组类型的lockNodeBytes表示锁路径对应的节点值。方法中会级联创建锁路径,即:锁路径的父路径不存在时,会一级一级的创建,而不是像原生的zookeeper create命令一样报错–父路径不存在。之前获取锁失败用于挂起线程的wait(),也是在LockInternals.this对象上调用的,这样JVM层面的互斥锁就对上了。用于记录每个线程持有的锁信息;

2401_84181193的博客 1125

利用zookeeper来实现个分布式锁

zookeeper实现分布式锁前言准备样例关键代码原理分析zookeeper和redis实现分布式锁的区别 前言 10个线程去下单,我们的库存只有5个,如果不加锁就会出现超卖 提示:以下是本篇文章正文内容,下面案例可供参考 准备样例 商品表,5个库存 再利用nginx做下负载均衡,使请求分配到2个tomcat里去,达到一个分布式效果。 准备好zookeeper,安装的方法我之前的博客有,使用也介绍过。 4. 准备压测工具Jmeter 项目的controller地址 启动服务8080

烟花易冷 235

分布式协调框架:Zookeeper

1 原理 文件系统 + watch 机制 2 功能 2.1 注册中心 2.2 分布式锁 3 实现 3.1 分布式锁 3.1.1 流程图 3.1.2 pom <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.0.0</version>

心之所系的博客 231

分布式锁之Zookeeper

zookeeper zookeeper介绍 ZooKeeper是一种用于分布式应用程序的分布式开源协调服务。它公开了一组简单的原语,分布式应用程序可以构建使用这些原语,以实现更高级别的服务,如实现同步,配置维护以及组和命名。 它被设计为易于编程,并使用在熟悉的文件系统目录树结构之后设计的数据模型。 Curator介绍 Curator是ZooKeeper的一个Java客户端框架, 它将zk本身提供的...

江无羡 296

zookeeper下的分布式锁

  zookeeper是hadoop下面的一个子项目, 用来进行分布式系统之间的相互协调。 在zookeeper源码包的recipe目录下有一个互斥锁lock的实现范例,笔者对其简要包装,以便看起来更为明了:   package org.apache.zookeeper.recipes.lock; import java.io.IOException; import org.a...

chenkangxian的专栏 169

zookeeper分布式锁(辅助类)

一、背景 在分布式环境中,多线程中的各种锁是不生效的(由于程序在多台机器上运行),即使是单线程,一旦访问临界资源,也会出错的。 因此我们需要分布式锁来对临界资源进行同步访问。 在此,介绍基于zookeeper,curator实现的分布式锁,包括InterProcessMutex锁、InterProcessReadWriteLock读写锁、 信号量InterProcessSemaphoreV

panda-star的博客 4327
上一篇: Zookeeper实现分布式屏障
下一篇: 使用flume-ng+kafka+storm+mysql 搭建实时日志处理平台
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值