curator 锁之 Shared Reentrant Lock

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 状态被报告 那可以确定你已经不再拥有这个锁了.




				
时间: 2024-10-11 22:03:41

curator 锁之 Shared Reentrant Lock的相关文章

【Linux/Ubuntu学习 7】E: 无法获得锁 /var/lib/dpkg/lock – open (11: 资源暂时不可用) E: 无法锁定管理目录

在用sudo apt-get install 安装软件时,由于速度太慢,想换个软件源,直接关闭了终端,apt-get但进程没有结束,结果终端提示 :“E: 无法获得锁 /var/lib/dpkg/lock – open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?” 解决办法如下: 1 终端输入 ps -aux ,列出进程.找到含有apt‘-get的进程,直接sudo kill PID.解决. 2 强制解锁,命令 sudo rm /

无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ubuntu 安装vim 及遇到的错误处理

今天,处理完问题,闲来无事,打算在虚拟机中的Ubuntu中练习shell脚本编写. 无奈,虚拟机系统所装的只有vi,这个编辑软件对于我们来说还是比较不习惯的,所以打算安装vim.好了,闲言少叙. 安装vim: 1.我是虚拟机系统避免麻烦,直接切换的root用户.输入:apt-get install vim-gtk 命令即可安装,如果非root用户,在命令前方加入sudo,即:sudo apt-get install vim-gtk 即可安装vim工具. 2.可是再安装的时候报了一个错,错误内容如

无法获得锁 /var/lib/dpkg/lock -open

有些Linux用户在使用Linux的过程中发现无法获得锁 /var/lib/dpkg/lock了,面对这个问题用户们要怎么解决呢?下面小编就教大家解决这个问题的方法,有需要的用户快来看看吧. 解决方法: 取:17 http://security.kali.org kali/updates/contrib Sources [20 B] 获取:18 http://security.kali.org kali/updates/non-free Sources [20 B] 获取:19 http://s

ubuntu 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)

结果终端提示: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?" 解决办法如下: 1.终端输入 ps  -aux ,列出进程,找到含有apt-get的进程,直接sudo kill PID解决. 2.强制解锁--命令: sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock

《深入浅出 Java Concurrency》—锁紧机构(一)Lock与ReentrantLock

转会:http://www.blogjava.net/xylz/archive/2010/07/05/325274.html 前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来总体说明. 从这一章開始花少量的篇幅谈谈锁机制. 上一个章节 中谈到了锁机制,而且针对于原子操作谈了一些相关的概念和设计思想.接下来的文章中.尽可能的深入研究锁机制,而且理解里面的原理和实际应用场合. 虽然synchronized在语法上已经足够简单了.在JDK 5之前仅仅能借助此实现,

解决问题E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)

在用sudo apt-get install 安装软件时,结果终端提示: "E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?" 解决办法如下:1.终端输入 ps  -aux ,列出进程.找到含有apt'-get的进程,直接sudo kill PID.解决. 2.强制解锁,命令 sudo rm /var/cache/apt/archives/lock sudo

无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)

问题描述: 有时候使用 apt-get 终端提示这样的错误信息: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?" 解决办法: 方法一:强制解锁--命令: sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock 方法二:终端输入 ps -aux ,列出进程,找到含有 apt-get 的进程,直接sud

无法获得锁/var/lib/dpkg/lock - open(11.资源暂时不可用)

E:无法获得锁/var/lib/dpkg/lock  - open(11.资源暂时不可用) E:无法锁定资源目录(/var/lib/dpkg)是否有其他进程正占用它? 解决方案: sudo rm /var/lib/apt/lists/lock sudo rm /var/lib/dpkg/lock 原文地址:https://www.cnblogs.com/Toney-01-22/p/9870453.html

Ubuntu 安装软件时显示:无法获得锁 /var/lib/dpkg/lock -open(资源暂时不可用)

出错状况:在用 sudo apt-get install 安装软件时,结果终端提示: 无法获得锁 /var/lib/dpkg/lock -open(资源暂时不可用) 无法锁定管理目录(var/lib/dpkg/),是否有其它进程正在占用它? 出错原因:在安装其它软件时,中途退出了终端,但是 apt-get 进程并没有退出. 解决办法: 方法一:终端输入 ps -aux | grep "apt-get", 找到与 apt-get 有关的进程,用 sudo kill PID 杀掉该进程.