基础知识: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. ubuntu编译安装opencv

    简易安装opencv2: conda install --channel https://conda.anaconda.org/menpo opencv 或: sudo apt-get install ...

  2. 执行monkey APK 制作

    一.主布局文件 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/an ...

  3. JavaScript中易混淆的DOM属性及方法对比

    JavaScript中易混淆的DOM属性及方法对比 ParentNode.children VS Node.prototype.childNodes ParentNode.children:该属性继承 ...

  4. Visual C++ 6.0中互换两个数字

    就好比如两杯水,需要三个杯子将这两杯水互换.互换数字就要用一个中间变量. # include <stdio.h> int main(void) { int i; int j; int k; ...

  5. Masonry学习札记

    Masnory学习札记 在之前的文章里有草草提到过Masonry自动布局,可这么重要第三方布局框架的怎么可以怎么随便带过呢!昨天在完成页面的时候刚好遇到了被Masorny功能惊叹的部分,所以趁热打铁写 ...

  6. cocos creator 中的粒子效果

    途中的粒子效果,通过plist文件和png两个文件,创建一个粒子节点,将plist文件拖入到粒子节点的file属性中,然后给custom属性打钩,把png文件拖入到texture属性中即可.

  7. Wpf TemplateBinding

    TemplateBinding. ControlTemplate最终会被用到一个控件上,我们称这个控件为模板目标控件或者模板化控件,ControlTemplate里面的控件可以使用TemplateBi ...

  8. ITextSharp构造PDF文件

    1.1 生成Document Document是我们要生成的PDF文件所有元素的容器,因此要生成一个PDF文档,必须首先定义一个Document对象. Document有三种构造函数:    publ ...

  9. SOCKET.IO 的用法 系统API,

    原文:http://www.cnblogs.com/xiezhengcai/p/3956401.html 1. 服务端 io.on('connection',function(socket)); 监听 ...

  10. mysql中的备份(backup)和恢复(recovery)

    (一)备份类型(backup type) 物理和逻辑备份(Physical Versus Logical Backup) 物理备份是指直接复制存储数据库内容的目录和文件,这种类型的备份适用于出现问题时 ...