真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式讀寫鎖

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān) 如何使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式讀寫鎖,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比吳興網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式吳興網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋吳興地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。

讀寫鎖:

使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式鎖(讀寫鎖)。

簡(jiǎn)單介紹一下讀寫鎖,在使用讀寫鎖時(shí), 多個(gè)客戶端(線程)可以同時(shí)獲取 “讀鎖”, 但是“寫入鎖”是排它的,只能單獨(dú)獲取。

1、假設(shè)A,B線程獲取到 “讀鎖”, 這時(shí)C線程就不能獲取 “寫鎖”。

2、假設(shè)C線程獲取了“寫鎖”,那么A,B線程就不能獲取“讀鎖”。

這在某種情況下會(huì)大幅度提高系統(tǒng)的性能,在單JVM進(jìn)程內(nèi) Java已經(jīng)提供了這種鎖的機(jī)制,可以參考ReentrantReadWriteLock這個(gè)類。

基于ZK的分布式讀寫鎖:

本文主要介紹ZK的分布式讀寫鎖,還是基于Curator客戶端實(shí)現(xiàn)。

package com.framework.code.demo.zook.lock;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.framework.recipes.locks.InterProcessReadWriteLock;
import org.apache.curator.retry.ExponentialBackoffRetry;

public class ReadWriteLock {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
		CuratorFramework client = CuratorFrameworkFactory
				.newClient("192.168.1.103:2181", retryPolicy);
		client.start();
		
		InterProcessReadWriteLock readWriteLock = new InterProcessReadWriteLock(client, "/read-write-lock");
		
		//讀鎖
		final InterProcessMutex readLock = readWriteLock.readLock();
		//寫鎖
		final InterProcessMutex writeLock = readWriteLock.writeLock();
		
		try {
			readLock.acquire();
			System.out.println(Thread.currentThread() + "獲取到讀鎖");
			
			new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						//在讀鎖沒(méi)釋放之前不能讀取寫鎖。
						writeLock.acquire();
						System.out.println(Thread.currentThread() + "獲取到寫鎖");
					} catch (Exception e) {
						e.printStackTrace();
					} finally {
						try {
							writeLock.release();
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}
			}).start();
			//停頓3000毫秒不釋放鎖,這時(shí)其它線程可以獲取讀鎖,卻不能獲取寫鎖。
			Thread.sleep(3000);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			readLock.release();
		}
		
		Thread.sleep(1000000);
		client.close();
	}

}


如何使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式讀寫鎖


實(shí)現(xiàn)原理:

實(shí)現(xiàn)原理與之前介紹的鎖的原理基本類似,這里主要說(shuō)明一下不同之處。

1、寫入鎖在申請(qǐng)鎖時(shí)寫入的節(jié)點(diǎn)名稱是這樣的   xxxx-__WRIT__00000000xxx 例如:   _c_9b6e456b-94fe-47e7-b968-34027c094b7d-__WRIT__0000000006

2、讀取鎖在申請(qǐng)鎖時(shí)寫入的節(jié)點(diǎn)名稱是這樣的  xxxx-__READ__00000000xxx 例如:    _c_9b6e456b90-9c33-6294665cf525--b6448-__READ__0000000005

區(qū)別就是寫入鎖的字符串包含WRIT,讀取所包含READ

獲取鎖的區(qū)別:

1、寫入鎖在獲取鎖時(shí)的處理與前面文章介紹的原理一直,就是判斷自己前面還有沒(méi)有節(jié)點(diǎn),如果沒(méi)有就可以獲取到鎖,如果有就等待前面的節(jié)點(diǎn)釋放鎖。

2、讀取鎖在獲取鎖時(shí)的處理是,判斷自己前面還有沒(méi)有寫入鎖的節(jié)點(diǎn),也就是前面的節(jié)點(diǎn)是否包含WRIT,如果有那么等待前面的節(jié)點(diǎn)釋放鎖。

讀取所自己前面有 其它 讀取鎖節(jié)點(diǎn) 無(wú)所謂,它仍然可以獲取到鎖,這也就是讀取所可以多客戶端共享的原因。

上述就是小編為大家分享的 如何使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式讀寫鎖了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


本文題目:如何使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式讀寫鎖
分享鏈接:http://weahome.cn/article/jsdhij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部