成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式鎖優(yōu)化思路是什么

使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式鎖優(yōu)化思路是什么,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)高邑,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108

問(wèn)題:我們都知道在單個(gè)JVM內(nèi)部實(shí)現(xiàn)鎖的機(jī)制很方便,Java也提供了很豐富的API可以實(shí)現(xiàn),例如Synchronized關(guān)鍵字, ReentrantLock等等,但是在集群環(huán)境中,都是多個(gè)JVM協(xié)同工作,當(dāng)需要一些全局鎖時(shí)就要用到上面介紹的分布式鎖了,但是這種鎖的缺點(diǎn)在于每次客戶端(這里說(shuō)的客戶端可以理解為不同JVM當(dāng)中的線程)需要獲取鎖時(shí)都需要與zook服務(wù)端交互,創(chuàng)建znode,等待著自己獲取鎖,這種網(wǎng)絡(luò)通信無(wú)疑會(huì)給服務(wù)器帶來(lái)一定的壓力,那么我們有沒(méi)有什么辦法來(lái)減少這種壓力呢?

場(chǎng)景:有一種很常見(jiàn)的場(chǎng)景就是更新緩存,那么我們一般的處理邏輯如下。

1、 首選根據(jù)key獲取資源,如果資源存在,用之。

2、如果不存在,則申請(qǐng)獲取鎖(使用共享鎖)。

3、獲取到鎖以后,再次判斷資源是否存在(防止重復(fù)更新),如果存在說(shuō)明已經(jīng)有人更新了,方法退出,否則更新緩存。

4、釋放鎖。

假設(shè)現(xiàn)在有10(1-10)個(gè)線程同時(shí)執(zhí)行上訴邏輯,如果資源不存在,那么它們?nèi)繒?huì)執(zhí)行第(2)步獲取鎖,在同一時(shí)刻,只會(huì)有1個(gè)線程獲取鎖,其它9個(gè)線程阻塞,等待獲取鎖。現(xiàn)在我們假設(shè)線程1獲取到鎖,開(kāi)始執(zhí)行(3-4)步動(dòng)作,在第(3步)當(dāng)中,再次判斷資源是否存在,(肯定不存在因?yàn)樗堑谝粋€(gè)進(jìn)去的),所以它負(fù)責(zé)加載資源放入緩存,然后釋放鎖, 再說(shuō)其它線程(2-10)它們依次獲取到鎖,然后執(zhí)行(3,4)動(dòng)作,再次判斷資源是否存在(已經(jīng)存在了,因?yàn)?號(hào)線程已經(jīng)放進(jìn)去了),所以他們直接退出,釋放鎖。由此可見(jiàn)只有1號(hào)線程獲取鎖是有意義的,但是它們都需要與zook進(jìn)行網(wǎng)絡(luò)通訊,因此會(huì)給網(wǎng)絡(luò)帶來(lái)壓力。

如果說(shuō)我們有A,B 二臺(tái)服務(wù)器進(jìn)行集群,這10個(gè)線程獲取鎖的請(qǐng)求分別來(lái)自這2臺(tái)服務(wù)器,例如(1-5)號(hào)線程來(lái)自A服務(wù)器, (6-10)號(hào)線程來(lái)自B服務(wù)器,那么它們與zk交互了10次,創(chuàng)建10個(gè)znode來(lái)申請(qǐng)鎖,但是如果我們進(jìn)行一定的優(yōu)化,它們只要與zk交互2次就夠了,我們來(lái)把上面的邏輯改造一下。

1、 首選根據(jù)key獲取資源,如果資源存在,用之。

2、如果不存在,則申請(qǐng)獲取鎖(JVM進(jìn)程內(nèi)的鎖)。

3、獲取到鎖(JVM進(jìn)程內(nèi)的鎖),再次判斷資源是否存在,如果資源存在就退出,沒(méi)啥好所的。

4、如果資源不存在,則申請(qǐng)獲取鎖(分布式鎖)。

5、獲取到鎖(分布式鎖)再次判斷資源是否存在(防止重復(fù)更新),如果存在說(shuō)明已經(jīng)有人更新了,方法退出,否則更新緩存。

6、釋放分布式鎖,釋放JVM進(jìn)程內(nèi)的鎖。

代碼:我把實(shí)現(xiàn)邏輯都放在一起了,方便給大家演示,如果有邏輯錯(cuò)誤歡迎大家留言指正。

package com.framework.code.demo.zook;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

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;

import com.framework.code.demo.zook.lock.NoFairLockDriver;

public class Main {
	
	//我們用一個(gè)static的map模擬一個(gè)第三方獨(dú)立緩存
	public static Map<String, Object> redis = new HashMap<String, Object>();
	public static final String key = "redisKey";
	
	public static void main(String[] args) throws InterruptedException {
		//創(chuàng)建倆個(gè)對(duì)象分別模擬2個(gè)進(jìn)程
		RedisProcess processA = new RedisProcess();
		RedisProcess processB = new RedisProcess();
		
		//每個(gè)進(jìn)程別分用50個(gè)線程并發(fā)請(qǐng)求
		ExecutorService service = Executors.newFixedThreadPool(100);
		for (int i = 0; i < 50; i++) {
			service.execute(processA);
			service.execute(processB);
		}
		
		service.shutdown();
		service.awaitTermination(30, TimeUnit.SECONDS);
	}
	
	public static class RedisProcess implements Runnable {
		CuratorFramework client;
		//ZK分布式鎖
		InterProcessMutex distributedLock;
		//JVM內(nèi)部鎖
		ReentrantLock jvmLock;
		
		public RedisProcess() {
			client = CuratorFrameworkFactory.newClient("192.168.1.18:2181", 
					new ExponentialBackoffRetry(1000,3));
			client.start();
			distributedLock = new InterProcessMutex(client,"/mylock", new NoFairLockDriver());
			jvmLock = new ReentrantLock();
		}

		@Override
		public void run() {
			//(1)首先判斷緩存內(nèi)資源是否存在
			if(redis.get(key) == null) {
				try {
					
					//這里延時(shí)1000毫秒的目的是防止線程過(guò)快的更新資源,那么其它線程在步驟(1)處就返回true了.
					Thread.sleep(1000);
					
					//獲取JVM鎖(同一進(jìn)程內(nèi)有效)
					jvmLock.lock();
					
					//(2)再次判斷資源是否已經(jīng)存在
					if(redis.get(key) == null) {
						System.out.println("線程:" + Thread.currentThread() + "獲取到JVM鎖,redis.get(key)為空, 準(zhǔn)備獲取ZK鎖");
						
						//這里延時(shí)500毫秒的目的是防止線程過(guò)快更新資源,其它線程在步驟(2)就返回true了。
						Thread.sleep(500);
						try {
							//獲取zk分布式鎖
							distributedLock.acquire();
							System.out.println("線程:" + Thread.currentThread() + "獲取到JVM鎖,redis.get(key)為空, 獲取到了ZK鎖");

							//再次判斷,如果為空這時(shí)可以更新資源
							if(redis.get(key) == null) {
								redis.put(key, Thread.currentThread() + "更新了緩存");
								System.out.println("線程:" + Thread.currentThread() + "更新了緩存");
							} else {
								System.out.println("線程:" + Thread.currentThread() + "當(dāng)前資源已經(jīng)存在,不需要更新");
							}
						} catch (Exception e) {
							e.printStackTrace();
						} finally {
							//釋放ZK鎖
							try {
								distributedLock.release();
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
					} else {
						System.out.println("線程:" + Thread.currentThread() + "獲取到JVM鎖,redis.get(key)不為空," + redis.get(key));
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				} finally {
					//釋放JVM鎖
					jvmLock.unlock();
				}
			} else {
				System.out.println(redis.get(key));
			}
		}
	}

}



線程:Thread[pool-5-thread-2,5,main]獲取到JVM鎖,redis.get(key)為空, 準(zhǔn)備獲取ZK鎖
線程:Thread[pool-5-thread-3,5,main]獲取到JVM鎖,redis.get(key)為空, 準(zhǔn)備獲取ZK鎖
線程:Thread[pool-5-thread-3,5,main]獲取到JVM鎖,redis.get(key)為空, 獲取到了ZK鎖
線程:Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-7,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-1,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-5,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-9,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-23,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-19,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-11,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-31,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-35,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-15,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-27,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-25,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-33,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-37,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-13,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-17,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-2,5,main]獲取到JVM鎖,redis.get(key)為空, 獲取到了ZK鎖
線程:Thread[pool-5-thread-2,5,main]當(dāng)前資源已經(jīng)存在,不需要更新
線程:Thread[pool-5-thread-21,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-29,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-55,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-59,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-41,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-67,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-39,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-43,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-57,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-47,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-51,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-63,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-8,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-69,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-4,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-6,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-10,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-22,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-16,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-20,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-45,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-24,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-32,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-36,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-49,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-28,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-12,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-14,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-26,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-53,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-18,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-61,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-30,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-65,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-34,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-97,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-40,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-91,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-64,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-42,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-46,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-50,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-87,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-85,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-44,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-75,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-48,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-71,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-77,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-52,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-99,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-93,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-56,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-60,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-95,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-89,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-81,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-73,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-68,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-58,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-62,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-66,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-38,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-54,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-94,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-83,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-96,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-79,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-92,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-90,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-80,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-82,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-72,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-78,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-100,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-70,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-88,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-84,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-98,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-86,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-76,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存
線程:Thread[pool-5-thread-74,5,main]獲取到JVM鎖,redis.get(key)不為空,Thread[pool-5-thread-3,5,main]更新了緩存

我們通過(guò)觀察日志,發(fā)現(xiàn)只有2個(gè)次需要獲取分布式鎖,其它的都被JVM鎖給阻擋在外面了,在這種情況下可以大大的提高鎖的性能。

關(guān)于 使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式鎖優(yōu)化思路是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

本文標(biāo)題:使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式鎖優(yōu)化思路是什么
網(wǎng)頁(yè)路徑:http://jinyejixie.com/article8/gcesip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、企業(yè)建站、ChatGPT、搜索引擎優(yōu)化網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
屏东市| 安多县| 邵武市| 博客| 庆云县| 梨树县| 衡东县| 固始县| 凭祥市| 永川市| 衡东县| 赣榆县| 光泽县| 洛隆县| 西华县| 新绛县| 嘉禾县| 永和县| 马龙县| 定襄县| 福州市| 唐河县| 聂拉木县| 福安市| 迁安市| 库伦旗| 巢湖市| 博爱县| 偃师市| 施甸县| 江油市| 万州区| 贺兰县| 普安县| 罗平县| 遂宁市| 丰县| 靖宇县| 隆尧县| 库车县| 四会市|