文档章节

curator 锁之 Shared Reentrant Lock

y
 yiqifendou
发布于 2016/10/08 21:15
字数 806
阅读 23
收藏 0

1、描述
共享锁:全局同步分布式锁,同一时间两台机器只能有一台获得锁

2、参与类
InterProcessMutex

3、用法

3.1 创建

InterProcessMutex 实例

public InterProcessMutex(CuratorFramework client,
                         String path)
Parameters:
client - client
path - the path to lock

3.2 一般用法

用其中一个方法,获取锁

public void acquire()
Acquire the mutex - blocking until it's available. Note: the same thread can call acquire
re-entrantly. Each call to acquire must be balanced by a call to release()

在锁可用之前会获取互斥锁会一直阻塞。注意:同一个线程可用调用 acquire 重新参与争抢锁资源.每次调用都要调 release() 平衡。

public boolean acquire(long time,
                       TimeUnit unit)
Acquire the mutex - blocks until it's available or the given time expires. Note: the same thread can
call acquire re-entrantly. Each call to acquire that returns true must be balanced by a call to release()

Parameters:
time - time to wait
unit - time unit
Returns:
true if the mutex was acquired, false if not

该方法在锁可用或者超时之前会阻塞. 返回 true 表示已获取到锁.
调用 release() 释放互斥体

public void release()
Perform one release of the mutex if the calling thread is the same thread that acquired it. If the
thread had made multiple calls to acquire, the mutex will still be held when this method returns.

如果是执行 acquired 操作的线程调用该方法会释放一个互斥体.但如果一个线程已经多次调用 acquired 操作,那当该方法返回时,互斥体会依然被保留。
NOTE: A InterProcessMutex instance is reusable. i.e. don't create a new instance every time. Re-use a single instance.
注意:InterProcessMutex 实例 是可重用的.不用每次都创建一个新的实例. 重用一个单实例.

4、撤销
InterProcessMutex supports a cooperative revocation mechanism as described on the ZooKeeper recipes wiki
InterProcessMutex支持可协商的撤回机制,正如在 ZK recipes 模块中描述的一样。
调用 makeRevocable 方法撤回互斥体

public void makeRevocable(RevocationListener<T> listener)
Make the lock revocable. Your listener will get called when another process/thread wants you to release the lock. Revocation is cooperative.
Parameters:
listener - the listener

使锁可撤销.当其他进程/线程想让你释放锁时,RevocationListener 监听器会被调用. 撤销是可协商的.
To ask for a lock to revoke/release, use the static method in the Revoker class:
让一个锁撤销/释放,可以使用 Revoker 类中的静态方法

public static void attemptRevoke(CuratorFramework client,
                                 String path)
                         throws Exception
Utility to mark a lock for revocation. Assuming that the lock has been registered
with a RevocationListener, it will get called and the lock should be released. Note,
however, that revocation is cooperative.
Parameters:
client - the client
path - the path of the lock - usually from something like InterProcessMutex.getParticipantNodes()

标记锁撤回的作用.如果锁已经注册了 RevocationListener 监听器,这个方法就会被调用,锁也会被释放. 注意:不管怎样,撤销都是可协商的。

5 错误处理

It is strongly recommended that you add a ConnectionStateListener and watch for SUSPENDED and LOST state changes. If a SUSPENDED state is reported you cannot be certain that you still hold the lock unless you subsequently receive a RECONNECTED state. If a LOST state is reported it is certain that you no longer hold the lock.

强烈推荐使用 ConnectionStateListener 监听器 监视 SUSPENDED and LOST 状态改变. 如果 SUSPENDED 状态被报告 ,你不能确信你依旧拥有这个锁(就是说不确定是不是还持有这把锁)除非你随后收到一个 RECONNECTED 状态. 如果 LOST 状态被报告 那可以确定你已经不再拥有这个锁了.

本文转载自:http://blog.csdn.net/a_fengzi_code_110/article/details/42586645

共有 人打赏支持
y
粉丝 5
博文 53
码字总数 9177
作品 0
南京
私信 提问
使用Zookeeper解决微服务架构下分布式事务问题

准备工作 单机调试zookeeper集群的话,我们需要在虚拟机里虚拟出几台“微服务器“,做这一步操作之前需要在系统中预留出来8G以上磁盘空间,4G以上物理内存。 [if !supportLists]1. [endif]虚...

A尚学堂Nancy老师
09/17
0
0
分布式利器Zookeeper(三)

前言 《分布式利器Zookeeper(一)》 《分布式利器Zookeeper(二):分布式锁》 本篇博客是分布式利器Zookeeper系列的最后一篇,涉及的话题是:Zookeeper分布式锁的代码实现、zkclient的使用、...

zfz_linux_boy
07/01
0
0
Apache Curator 2.7.0 发布

Apache Curator 2.7.0 发布,此版本现已提供下载,二进制包提供在 Maven 库。更新内容请看这里: Bug 修复 [CURATOR-42] - Background guaranteed delete considers NoNode to be a failed ...

oschina
2014/11/04
2.5K
0
ZooKeeper学习笔记六 ZooKeeper开源客户端Curator

本文学习资源来自《从Paxos到ZooKeeper分布式一致性原理与实践》 Curator Curator是Netflix公司开源的一套ZooKeeper客户端框架,作者是Jordan Zimmerman。 和ZkClient一样,Curator解决了很多...

xundh
04/28
0
0
ZooKeeper典型使用场景

先需要下载 curator 的依赖包 curator-framework curator-recipes Guava-14.0.1 分布式锁 在分布式环境中,为了保证数据的一致性,经常在程序的某个运行点需要进行同步控制。 类是一个同步计...

兔之
2015/10/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 如何实现线程间通信?

正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。 本文涉及到的知识点: thread.join(), object....

颖辉小居
27分钟前
1
0
记一次阿里云服务器运行慢排除

公司测试环境用的阿里云服务器+docker部署的,一共跑了14个项目。之前几个月一直OK,最近几天突然很卡很慢。刚开始以为是项目问题,又是扩大内存,又是清减插件,甚至停了一半项目。结果CPU...

李玉长
27分钟前
2
0
统一客服消息返回错误:{"errcode":43004,"errmsg":"require subscribe hint: [9Vv08633952]"}

公众号或者小程序发送客服消息错误: {"errcode":43004,"errmsg":"require subscribe hint: [9Vv08633952]"} 场景:小程序使用公众号的服务消息,推送消息,如果接收人没有关注公众号,就会出...

tianma3798
38分钟前
1
0
Rainbond V5.0 Beta公测公告

Rainbond支撑企业应用的开发、架构、交付和运维的全流程,通过“无侵入”架构无缝衔接各类企业应用,底层资源可以对接和管理IaaS、虚拟机和物理服务器 Rainbond V5.0即日起开启Beta版本公测,...

好雨云帮
56分钟前
2
0
Word Pattern(leetcode290)

Given a pattern and a string str, find if str follows the same pattern. Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empt......

woshixin
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部