Zookeeper实现独占锁

原创 2018年04月17日 12:19:31

排它锁(Exclusive Locks,简称X锁),又称为写锁。

如果事务T1对数据对象o1加上了排它锁,那么在整个加锁期间,只允许事务T1对o1进行读取和更新操作,其他任何事务都不能在这个数据对象进行任何类型的操作(不能再对该对象加锁),直至T1释放了排他锁。

public class DistributeLock implements Watcher{
	private ZooKeeper zooKeeper;
	/** zookeeper服务器地址 */
	public static final String connectString = "192.168.50.110:2181,192.168.50.111:2181,192.168.50.112:2181";
	/** 定义session失效时间 */
	public static final int sessionTimeout = 5000;
	private String path = "/lock";
	
	private CountDownLatch cl;
	private CountDownLatch cl2 = new CountDownLatch(1);
	
	Thread t;
	public DistributeLock(String host ,final String path) {
		try {
			this.zooKeeper = new ZooKeeper(host, 6000,this);
			
			try {
				cl2.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		this.path = path;
	}
	
	/**
	 * 加锁
	 */
	public void lock() {
		try {
			zooKeeper.create(path, path.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
		 } catch (Exception e) {
			 try {
				cl= new CountDownLatch(1);
				cl.await(1000,TimeUnit.MICROSECONDS);
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
		    lock();
		}
	}
	/**
	 * 释放锁
	 */
	public  void unlock() {
		try {
			zooKeeper.exists(path, true);
			zooKeeper.delete(path, -1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (KeeperException e) {
			e.printStackTrace();
		}
		
	}

	@Override
	public void process(WatchedEvent event) {
		
		System.out.println("进入 process 。。。。。event = " + event);
		
		try {
			Thread.sleep(200);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		if (event == null) {
			return;
		}
		
		// 连接状态
		KeeperState keeperState = event.getState();
		// 事件类型
		EventType eventType = event.getType();
		// 受影响的path
		String path = event.getPath();
		
		String logPrefix="";
		System.out.println(logPrefix + "收到Watcher通知");
		System.out.println(logPrefix + "连接状态:\t" + keeperState.toString());
		System.out.println(logPrefix + "事件类型:\t" + eventType.toString());

		if (KeeperState.SyncConnected == keeperState) {
			// 成功连接上ZK服务器
			if (EventType.None == eventType) {
				System.out.println( "成功连接上ZK服务器");
				cl2.countDown();
			} 
			//删除节点
			else if (EventType.NodeDeleted == eventType) {
				System.out.println("线程:"+t.getName()+logPrefix + "节点 " + path + " 被删除");
			}
			else ;
		} 
		else if (KeeperState.Disconnected == keeperState) {
			System.out.println(logPrefix + "与ZK服务器断开连接");
		} 
		else if (KeeperState.AuthFailed == keeperState) {
			System.out.println(logPrefix + "权限检查失败");
		} 
		else if (KeeperState.Expired == keeperState) {
			System.out.println(logPrefix + "会话失效");
		}
		else ;

		System.out.println("--------------------------------------------");

	}
}

测试类(不加锁):

public class LockTest implements Runnable {
	static int i = 0;

	DistributeLock lock = new DistributeLock(ZookeeperUtil.connectString, "/lock");

	@Override
	public void run() {
		// lock.lock();
		for (int j = 0; j < 1000000; j++) {
			i++;
		}
		// lock.unlock();
	}

	public static void main(String[] args) throws InterruptedException {
		LockTest lockTest2 = new LockTest();
		LockTest lockTest1 = new LockTest();
		Thread thread = new Thread(lockTest2);
		Thread thread2 = new Thread(lockTest1);
		thread.start();
		thread2.start();
		thread.join();
		thread2.join();
		System.out.println(i);

	}

测试结果:

测试类(加锁):

public class LockTest implements Runnable {
	static int i = 0;

	DistributeLock lock = new DistributeLock(ZookeeperUtil.connectString, "/lock");

	@Override
	public void run() {
		lock.lock();
		for (int j = 0; j < 1000000; j++) {
			i++;
		}
		lock.unlock();
	}

	public static void main(String[] args) throws InterruptedException {
		LockTest lockTest2 = new LockTest();
		LockTest lockTest1 = new LockTest();
		Thread thread = new Thread(lockTest2);
		Thread thread2 = new Thread(lockTest1);
		thread.start();
		thread2.start();
		thread.join();
		thread2.join();
		System.out.println(i);

	}

}

测试结果:


zookeeper

ZooKeeper是现在企业项目开发之中使用最多的协调一致性组件,其不仅仅在大数据领域内有着重要的作用,在分布式开发领域内依然重要,本课程将为读者讲解ZooKeeper的作用,以及相关的代码开发操作。
  • 2017年01月20日 07:38

zookeeper 分布式 独占锁

参照apache官网zookeeper recipe 实现分布式独占锁。 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,对节点的写操作为原子性的,故可以实现分布式锁。   ...
  • qq_18167901
  • qq_18167901
  • 2016-02-17 16:51:23
  • 902

对于Zookeeper中提及的排它锁、共享锁和悲观锁、乐观锁的理解

排它锁 (简称X锁),又称为写锁或独占锁,是一种基本的锁类型。如果事务T1对数据对象O1加上了排它锁,那么在整个加锁期间,只允许事务T1对O1进行读取和更新操作,其它任何事务都帮你再对这个数据对象进...
  • u012736748
  • u012736748
  • 2018-01-10 14:31:22
  • 127

Zookeeper学习笔记(四)分布式锁

一、排他锁与共享锁 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。分为排他锁和共享锁。 排他锁 排他锁(Exclusive Locks, 简称 X 锁),又称为写锁或独占锁,是一种基本的锁类...
  • zhutulang
  • zhutulang
  • 2017-08-20 17:24:56
  • 840

ZooKeeper场景实践:(7) 分布式锁

我们准备来实现互斥的锁,按照官网的思路,给定一个锁的路径,如/Lock,所有要申请这个锁的进程都在/Lock目录下创建一个/Lock/lock-的临时序列节点,并监控/Lock的子节点变化事件。当子节...
  • qq910894904
  • qq910894904
  • 2014-11-05 21:59:57
  • 2427

java独占锁ReenTrantLock的实现

ReenTrantLock的实现,源代码分析。
  • qq1004642027
  • qq1004642027
  • 2015-12-26 18:08:18
  • 726

AQS源码分析之独占锁和共享锁

AQS实现锁机制并不是通过synchronized——给对象加锁实现的,事实上它仅仅是一个工具类!它没有使用更高级的机器指令,也不靠关键字,更不依靠JDK编译时的特殊处理,仅仅作为一个普普通通的类就完...
  • luofenghan
  • luofenghan
  • 2017-07-13 15:06:45
  • 906

java并发-独占锁与共享锁

1 锁的独占与共享       java并发包提供的加锁模式分为独占锁和共享锁,独占锁模式下,每次只能有一个线程能持有锁,ReentrantLock就是以独占方式实现的互斥锁。共享锁,则允许多个线程同...
  • wojiushiwo945you
  • wojiushiwo945you
  • 2014-12-31 11:34:45
  • 10897

数据库碎片学习:独占锁、共享锁、更新锁,乐观锁、悲观锁

转自:http://blog.csdn.net/tuber727/article/details/12782247 共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 S...
  • jujulia_318
  • jujulia_318
  • 2014-05-28 15:38:41
  • 2377

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

一、使用ZooKeeper实现Java跨JVM的分布式锁 二、使用ZooKeeper实现Java跨JVM的分布式锁(优化构思) 三、 读写锁: 本文在前面俩片的基础之上介绍如何 使用ZooKeep...
  • nimasike
  • nimasike
  • 2016-06-03 21:35:19
  • 7367
收藏助手
不良信息举报
您举报文章:Zookeeper实现独占锁
举报原因:
原因补充:

(最多只允许输入30个字)