千家信息网

Curator教程(三)分布式锁

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,共享锁@Testpublic void sharedLock() throws Exception { // 创建共享锁 InterProcessLock lock = new Inter
千家信息网最后更新 2025年12月03日Curator教程(三)分布式锁
共享锁
@Testpublic void sharedLock() throws Exception {    // 创建共享锁    InterProcessLock lock = new InterProcessSemaphoreMutex(client, lockPath);    // lock2 用于模拟其他客户端    InterProcessLock lock2 = new InterProcessSemaphoreMutex(client2, lockPath);    // 获取锁对象    lock.acquire();    // 测试是否可以重入    // 超时获取锁对象(第一个参数为时间, 第二个参数为时间单位), 因为锁已经被获取, 所以返回 false    Assert.assertFalse(lock.acquire(2, TimeUnit.SECONDS));    // 释放锁    lock.release();    // lock2 尝试获取锁成功, 因为锁已经被释放    Assert.assertTrue(lock2.acquire(2, TimeUnit.SECONDS));    lock2.release();}
共享可重入锁
public void sharedReentrantLock() throws Exception {    // 创建可重入锁    InterProcessLock lock = new InterProcessMutex(client, lockPath);    // lock2 用于模拟其他客户端    InterProcessLock lock2 = new InterProcessMutex(client2, lockPath);    // lock 获取锁    lock.acquire();    try {        // lock 第二次获取锁        lock.acquire();        try {            // lock2 超时获取锁, 因为锁已经被 lock 客户端占用, 所以获取失败, 需要等 lock 释放            Assert.assertFalse(lock2.acquire(2, TimeUnit.SECONDS));        } finally {            lock.release();        }    } finally {        // 重入锁获取与释放需要一一对应, 如果获取 2 次, 释放 1 次, 那么该锁依然是被占用, 如果将下面这行代码注释, 那么会发现下面的 lock2 获取锁失败        lock.release();    }    // 在 lock 释放后, lock2 能够获取锁    Assert.assertTrue(lock2.acquire(2, TimeUnit.SECONDS));    lock2.release();}
共享可重入读写锁
@Testpublic void sharedReentrantReadWriteLock() throws Exception {    // 创建读写锁对象, Curator 以公平锁的方式进行实现    InterProce***eadWriteLock lock = new InterProce***eadWriteLock(client, lockPath);    // lock2 用于模拟其他客户端    InterProce***eadWriteLock lock2 = new InterProce***eadWriteLock(client2, lockPath);    // 使用 lock 模拟读操作    // 使用 lock2 模拟写操作    // 获取读锁(使用 InterProcessMutex 实现, 所以是可以重入的)    InterProcessLock readLock = lock.readLock();    // 获取写锁(使用 InterProcessMutex 实现, 所以是可以重入的)    InterProcessLock writeLock = lock2.writeLock();    /**     * 读写锁测试对象     */    class ReadWriteLockTest {        // 测试数据变更字段        private Integer testData = 0;        private Set threadSet = new HashSet<>();        // 写入数据        private void write() throws Exception {            writeLock.acquire();            try {                Thread.sleep(10);                testData++;                System.out.println("写入数据 \ t" + testData);            } finally {                writeLock.release();            }        }        // 读取数据        private void read() throws Exception {            readLock.acquire();            try {                Thread.sleep(10);                System.out.println("读取数据 \ t" + testData);            } finally {                readLock.release();            }        }        // 等待线程结束, 防止 test 方法调用完成后, 当前线程直接退出, 导致控制台无法输出信息        public void waitThread() throws InterruptedException {            for (Thread thread : threadSet) {                thread.join();            }        }        // 创建线程方法        private void createThread(int type) {            Thread thread = new Thread(new Runnable() {                @Override                public void run() {                    try {                        if (type == 1) {                            write();                        } else {                            read();                        }                    } catch (Exception e) {                        e.printStackTrace();                    }                }            });            threadSet.add(thread);            thread.start();        }        // 测试方法        public void test() {            for (int i = 0; i < 5; i++) {                createThread(1);            }            for (int i = 0; i < 5; i++) {                createThread(2);            }        }    }    ReadWriteLockTest readWriteLockTest = new ReadWriteLockTest();    readWriteLockTest.test();    readWriteLockTest.waitThread();}

测试结果如下:

写入数据 1
写入数据 2
读取数据 2
写入数据 3
读取数据 3
写入数据 4
读取数据 4
读取数据 4
写入数据 5
读取数据 5


数据 测试 客户 客户端 对象 方法 线程 参数 成功 一一对应 代码 信息 单位 字段 控制台 方式 注释 结果 面的 尝试 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库是人工智能重要应用 数据库12c向11g导出 ecc是服务器部件上的一项功能 网络安全服务交付难度 奉贤区上门软件开发厂家职责 医疗管理软件开发 云端服务器 安防 红辣椒网络安全吗 学了计算机网络技术可以干嘛 网络安全风险隐患排查总结 快递公司网络技术部经理职责 方舟生存进化8818服务器 中兴通讯数据库第一 R410服务器按了F10怎么办 现代化网络技术收购价 网络安全大赛培训机构排名 个税申报软件执行数据库操作失败 企邦在线网络技术有限公司 电脑数据库软件在哪里看 大专生网络技术安全开题报告 无线网络安全是指 互联网下科技发展的弊端 db2数据库查看实例名 qq音速 与服务器断开 hp 服务器管理 网络安全法中的网络指的是 计算机网络技术能制作游戏吗 域 组策略 不自动显示服务器名 新瑞网络安全 校园网络安全解决而方案
0