基础知识:http://www.cnblogs.com/LiZhiW/p/4931577.html

1 可重入读写锁示例代码如下(lock.acquire加几个,就必须使用几个lock.release()释放):

package com.topsec.lock;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry; /**
* 测试可重入锁(可以多次获得锁不会被阻塞,释放时也需释放多把锁)
* @author 76524
*
*/
public class SharedReentrantLock1 implements Runnable{
private InterProcessMutex lock;//可重入锁实现类
private String lockPAth = "/lock/shareLock";
private int i;
private String clientName;
//zookeeper集群地址
public static final String ZOOKEEPERSTRING = "192.168.99.129:2181,192.168.99.153:2181,192.168.99.171:2181"; public SharedReentrantLock1(CuratorFramework client,String clientName) {
lock = new InterProcessMutex(client, lockPAth);
this.clientName = clientName;
} public void run() {
try {
Thread.sleep((new java.util.Random().nextInt(2000)));
lock.acquire(); //增加第一把锁
if(lock.isAcquiredInThisProcess()) {
System.out.println(clientName + " 获得锁");
i++;
}
lock.acquire(); //增加第二把锁
} catch (Exception e) {
e.printStackTrace();
}finally {
try { System.out.println(clientName+"释放第一把锁");
lock.release();
System.out.println(clientName+"释放第二把锁");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } public static void main(String[] args) {
CuratorFramework client = CuratorFrameworkFactory.newClient(ZOOKEEPERSTRING, new ExponentialBackoffRetry(1000, 3));
client.start();
//启动100个线程进行测试
for(int i = 0;i<100;i++) {
SharedReentrantLock1 sharedReentrantLock = new SharedReentrantLock1(client, "第"+i+"个客户端:");
Thread thread = new Thread(sharedReentrantLock);
thread.start();
}
} }

2:不可重入锁示例代码如下(lock.acquire加几个都只相当于加一个):

package com.topsec.lock;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessSemaphoreMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;
/**
* 测试不可重入锁(只能获得一次锁,使用完后释放)
* @author 76524
*
*/
public class SharedNOReentrantLock implements Runnable{
private InterProcessSemaphoreMutex lock;//不可重入锁
private String lockPAth = "/lock/shareLock";
private int i;
private String clientName;
//zookeeper集群地址
public static final String ZOOKEEPERSTRING = "192.168.99.129:2181,192.168.99.153:2181,192.168.99.171:2181"; public SharedNOReentrantLock(CuratorFramework client,String clientName) {
lock = new InterProcessSemaphoreMutex(client, lockPAth);
this.clientName = clientName;
} public void run() {
try {
Thread.sleep((new java.util.Random().nextInt(2000)));
lock.acquire(); //增加第一把锁
if(lock.isAcquiredInThisProcess()) {
System.out.println(clientName + " 获得锁");
i++;
}
lock.acquire(); //增加第二把锁这个锁相当于不起作用
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
// lock.release();
System.out.println(clientName+"释放第一把锁");
lock.release();
System.out.println(clientName+"释放第二把锁");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } public static void main(String[] args) {
CuratorFramework client = CuratorFrameworkFactory.newClient(ZOOKEEPERSTRING, new ExponentialBackoffRetry(1000, 3));
client.start();
for(int i = 0;i<100;i++) {
SharedReentrantLock2 sharedReentrantLock = new SharedReentrantLock2(client, "第"+i+"个客户端:");
Thread thread = new Thread(sharedReentrantLock);
thread.start();
}
} }

8、Zookeeper分布式锁的更多相关文章

  1. Curator Zookeeper分布式锁

    Curator Zookeeper分布式锁 pom.xml中添加如下配置 <!-- https://mvnrepository.com/artifact/org.apache.curator/c ...

  2. ZooKeeper 分布式锁实现

    1 场景描述 在分布式应用, 往往存在多个进程提供同一服务. 这些进程有可能在相同的机器上, 也有可能分布在不同的机器上. 如果这些进程共享了一些资源, 可能就需要分布式锁来锁定对这些资源的访问. 2 ...

  3. ZooKeeper分布式锁浅谈(一)

    一.概述 清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的 ...

  4. [转载] zookeeper 分布式锁服务

    转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...

  5. 跟着大神学zookeeper分布式锁实现-----来自Ruthless

    前几天分享了@Ruthless大神的Redis锁,发现和大家都学习了很多东西.因为分布式锁里面,最好的实现是zookeeper的分布式锁.所以在这里把实现方式和大家分享一下. zookeeper分布式 ...

  6. zookeeper分布式锁

    摘要:分享牛原创,zookeeper使用,zookeeper锁在实际项目开发中还是很常用的,在这里我们介绍一下zookeeper分布式锁的使用,以及我们如何zookeeper分布式锁的原理.zooke ...

  7. 关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁

    首先分布式锁和我们平常讲到的锁原理基本一样,目的就是确保,在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法.变量. 在一个进程中,也就是一个jvm 或者说应用中,我们很容易去处理控制,在j ...

  8. zookeeper 分布式锁原理

    zookeeper 分布式锁原理: 1 大家也许都很熟悉了多个线程或者多个进程间的共享锁的实现方式了,但是在分布式场景中我们会面临多个Server之间的锁的问题,实现的复杂度比较高.利用基于googl ...

  9. 分布式锁(一) Zookeeper分布式锁

    什么是Zookeeper? Zookeeper(业界简称zk)是一种提供配置管理.分布式协同以及命名的中心化服务,这些提供的功能都是分布式系统中非常底层且必不可少的基本功能,但是如果自己实现这些功能而 ...

  10. ZooKeeper 分布式锁

    在Redis分布式锁一文中, 作者介绍了如何使用Redis开发分布式锁. Redis分布式锁具有轻量高吞吐量的特点,但是一致性保证较弱.我们可以使用Zookeeper开发分布式锁,来满足对高一致性的要 ...

随机推荐

  1. 使用LSTM-RNN建立股票预测模型

    硕士毕业之前曾经对基于LSTM循环神经网络的股价预测方法进行过小小的研究,趁着最近工作不忙,把其中的一部分内容写下来做以记录. 此次股票价格预测模型仅根据股票的历史数据来建立,不考虑消息面对个股的影响 ...

  2. python爬虫,使用BeautifulSoup解析爬出来的HTML代码时报错

    UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for thi ...

  3. MDK5报错missing closing quote

    用emwin做界面的时候遇到的错误,MDK5可能无法编译一些汉字编码,对应汉字在信息反馈中会显示为乱码,更会附带一些如“expected a "}"”这样的错误提示. 解决方法:O ...

  4. iOS开发之UIGestureRecognizer

    一:首先查看一下关于UIGestureRecognizer的定义 //当前手势状态 typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { //尚 ...

  5. git教程:管理修改

    转载:管理修改 现在,假定你已经完全掌握了暂存区的概念.下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件. 你会问,什么是修改?比如你新增了一行 ...

  6. 【EMV L2】Select PSE应用选择相关的卡片数据格式

    The data field of the response message contains the FCI specific to the selected PSE, DDF, or ADF. 一 ...

  7. redis的LRU算法(二)

    前文再续,书接上一回.上次讲到redis的LRU算法,文章实在精妙,最近可能有机会用到其中的技巧,顺便将下半部翻译出来,实现的时候参考下. 搏击俱乐部的第一法则:用裸眼观测你的算法 Redis2.8的 ...

  8. VirtualBox安装Archlinux并配置桌面环境

    最近无聊,就找来archlinux来玩一玩,去archlinux wiki上看了一下教程.以下是操作过程. 1. 下载镜像,下载地址; 2. 启动archlinux并选择Boot Arch Linux ...

  9. python request 和requests 的区别

    说明: 这里主要记录一下requests模块的如下几点: 1.requests模块的安装 2.requests模块发送get请求 3.requests模块发送post请求 4.requests模块上传 ...

  10. PAT1001A+B Format

    链接:https://www.patest.cn/contests/pat-a-practise/1001 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 ...