千家信息网

如何使用ZooKeeper实现Java跨JVM的分布式读写锁

发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,这期内容当中小编将会给大家带来有关 如何使用ZooKeeper实现Java跨JVM的分布式读写锁,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。读写锁:使用ZooKe
千家信息网最后更新 2025年02月07日如何使用ZooKeeper实现Java跨JVM的分布式读写锁

这期内容当中小编将会给大家带来有关 如何使用ZooKeeper实现Java跨JVM的分布式读写锁,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。


读写锁:

使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)。


简单介绍一下读写锁,在使用读写锁时, 多个客户端(线程)可以同时获取 "读锁", 但是"写入锁"是排它的,只能单独获取。

1、假设A,B线程获取到 "读锁", 这时C线程就不能获取 "写锁"。

2、假设C线程获取了"写锁",那么A,B线程就不能获取"读锁"。

这在某种情况下会大幅度提高系统的性能,在单JVM进程内 Java已经提供了这种锁的机制,可以参考ReentrantReadWriteLock这个类。


基于ZK的分布式读写锁:

本文主要介绍ZK的分布式读写锁,还是基于Curator客户端实现。

package com.framework.code.demo.zook.lock;import org.apache.curator.RetryPolicy;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.framework.recipes.locks.InterProcessMutex;import org.apache.curator.framework.recipes.locks.InterProcessReadWriteLock;import org.apache.curator.retry.ExponentialBackoffRetry;public class ReadWriteLock {        /**         * @param args         * @throws Exception          */        public static void main(String[] args) throws Exception {                RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);                CuratorFramework client = CuratorFrameworkFactory                                .newClient("192.168.1.103:2181", retryPolicy);                client.start();                                InterProcessReadWriteLock readWriteLock = new InterProcessReadWriteLock(client, "/read-write-lock");                                //读锁                final InterProcessMutex readLock = readWriteLock.readLock();                //写锁                final InterProcessMutex writeLock = readWriteLock.writeLock();                                try {                        readLock.acquire();                        System.out.println(Thread.currentThread() + "获取到读锁");                                                new Thread(new Runnable() {                                @Override                                public void run() {                                        try {                                                //在读锁没释放之前不能读取写锁。                                                writeLock.acquire();                                                System.out.println(Thread.currentThread() + "获取到写锁");                                        } catch (Exception e) {                                                e.printStackTrace();                                        } finally {                                                try {                                                        writeLock.release();                                                } catch (Exception e) {                                                        e.printStackTrace();                                                }                                        }                                }                        }).start();                        //停顿3000毫秒不释放锁,这时其它线程可以获取读锁,却不能获取写锁。                        Thread.sleep(3000);                } catch (Exception e) {                        e.printStackTrace();                } finally {                        readLock.release();                }                                Thread.sleep(1000000);                client.close();        }}




实现原理:

实现原理与之前介绍的锁的原理基本类似,这里主要说明一下不同之处。

1、写入锁在申请锁时写入的节点名称是这样的 xxxx-__WRIT__00000000xxx 例如: _c_9b6e456b-94fe-47e7-b968-34027c094b7d-__WRIT__0000000006

2、读取锁在申请锁时写入的节点名称是这样的 xxxx-__READ__00000000xxx 例如: _c_9b6e456b90-9c33-6294665cf525--b6448-__READ__0000000005

区别就是写入锁的字符串包含WRIT,读取所包含READ


获取锁的区别:

1、写入锁在获取锁时的处理与前面文章介绍的原理一直,就是判断自己前面还有没有节点,如果没有就可以获取到锁,如果有就等待前面的节点释放锁。

2、读取锁在获取锁时的处理是,判断自己前面还有没有写入锁的节点,也就是前面的节点是否包含WRIT,如果有那么等待前面的节点释放锁。

读取所自己前面有 其它 读取锁节点 无所谓,它仍然可以获取到锁,这也就是读取所可以多客户端共享的原因。

上述就是小编为大家分享的 如何使用ZooKeeper实现Java跨JVM的分布式读写锁了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

节点 线程 分布式 原理 客户 客户端 就是 也就是 内容 名称 文章 分析 处理 不同 无所谓 专业 中小 内容丰富 原因 同时 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 c 文件 数据库 钟馗之眼服务器开机密码 信息技术 数据库 网状模型 飞行安全精准数据库需不需要更新 电力集团网络安全 国际货币基金组织数据库技术员 网络安全高中周记 网络安全融媒体中心 提示已连接无法使用服务器 幼儿大班防范网络安全 研发费用超15亿网络安全股 zabbix数据库结构 网络服务器被人攻击可以报警吗 合适的物流软件开发公司 海淀区综合网络技术服务平台 数据库中什么叫模式和层次 服务器管理端口IP忘记了 ftp服务器启动 怎么用jcr数据库检索影响因子 要想取得好的网络技术就业 四川省农行软件开发中心 java软件开发环境 玉溪服务器上门回收价格 cache数据库表结构查询 网络安全保障存在漏洞 dm数据库安装及使用 ibm服务器数据恢复 网络安全风险监测指标 什么叫无法获取服务器版本号 江苏濠义互联网科技有限公司
0