亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Nacos服務(wù)發(fā)現(xiàn)并發(fā)啟動scheduleUpdate定時任務(wù)的流程分析

 更新時間:2023年02月23日 09:18:17   作者:禿禿愛健身  
這篇文章主要介紹了Nacos服務(wù)發(fā)現(xiàn)并發(fā)啟動scheduleUpdate定時任務(wù),本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、前言

博主今天復(fù)習(xí)Nacos源碼的時候,發(fā)現(xiàn)了一個算是有意思的細節(jié)點,這里分享一下。

二、服務(wù)發(fā)現(xiàn)“懶加載”機制

當nacos客戶端運?起來之后,它只是去做服務(wù)注冊、配置獲取等操作;并不會立即去請求服務(wù)信息;當?shù)谝淮握埱髸r候,才會去獲取服務(wù),即懶加載機制;

1、服務(wù)發(fā)現(xiàn)流程

Client端做服務(wù)發(fā)現(xiàn)時,無論是否能從本地緩存中獲取到服務(wù)實例信息,都會啟動一個定時任務(wù)(每秒做一次服務(wù)實例信息的更新)。然而由于可能多個請求同時要做服務(wù)發(fā)現(xiàn),這樣總不能每一次做服務(wù)發(fā)現(xiàn)時都去啟動一個定時任務(wù)做服務(wù)實例信息更新吧。所以肯定要有一個機制去確保針對某一個Cluster下的Service,當前Client只會啟動一個定時任務(wù)。

2、HostReactor#scheduleUpdateIfAbsent()

HostReactor#scheduleUpdateIfAbsent()方法負責(zé)啟動做服務(wù)實例信息更新的定時任務(wù)。
從方法名也能看出來:是當定時任務(wù)不存在時,才會啟動一個定時任務(wù)。

private final Map<String, ScheduledFuture<?>> futureMap = new HashMap<String, ScheduledFuture<?>>();

public void scheduleUpdateIfAbsent(String serviceName, String clusters) {
    if (futureMap.get(ServiceInfo.getKey(serviceName, clusters)) != null) {
        return;
    }
    
    synchronized (futureMap) {
        if (futureMap.get(ServiceInfo.getKey(serviceName, clusters)) != null) {
            return;
        }
        
        ScheduledFuture<?> future = addTask(new UpdateTask(serviceName, clusters));
        futureMap.put(ServiceInfo.getKey(serviceName, clusters), future);
    }
}

看一下這個代碼邏輯:

  • 為了防止一個實例開啟多個這種定時任務(wù),會用一個Map來去重,針對這個Map的數(shù)據(jù)添加會采用一個類似雙重檢查鎖的機制,確保Map添加數(shù)據(jù)的線程安全性。
  • 如果futureMap中已經(jīng)有了當前服務(wù),則方法直接返回。
  • 這一步是為了減少不必要的同步操作。
  • 否則,對futureMap對象加synchronized鎖;同步代碼塊需要再進一步判斷futureMap不為空。
  • 因為在多線程并發(fā)場景下,可能多個線程判斷futureMap中都沒有當前服務(wù),都進入到同步代碼塊,一個線程進入同步代碼塊,將當前服務(wù)添加到futureMap中。
  • 其他線程獲取到鎖之后再進入到同步代碼塊,再次判斷futureMap中是否含有當前服務(wù),如果含有,則方法直接返回。
  • 假如同步代碼中不判空,會重復(fù)執(zhí)行將當前服務(wù)添加到futureMap中的操作。

既然是DCL的變種版,為了futureMap沒有被volatile關(guān)鍵字修飾,不會有指令重排序的問題嗎?

  • 并不會,futureMap.put()是Map的添加數(shù)據(jù)操作,和對象初始化是兩種場景。

3、DCL

Double check Lock確保類單例的代碼如下:

public class DoubleCheckLazySingleton {

    private volatile static DoubleCheckLazySingleton singleton;

    private DoubleCheckLazySingleton() {
    }

    public DoubleCheckLazySingleton getSingleton() {
        if (singleton == null) {
            synchronized (this) {
                //只有在singleton為null的時候才創(chuàng)建實例
                if (singleton == null) {
                    singleton = new DoubleCheckLazySingleton();
                }
            }
        }
        return singleton;
    }
}

到此這篇關(guān)于Nacos服務(wù)發(fā)現(xiàn)并發(fā)啟動scheduleUpdate定時任務(wù)的文章就介紹到這了,更多相關(guān)Nacos服務(wù)發(fā)現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot數(shù)據(jù)庫初始化datasource配置方式

    SpringBoot數(shù)據(jù)庫初始化datasource配置方式

    這篇文章主要為大家介紹了SpringBoot數(shù)據(jù)庫初始化datasource配置方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Java1.8中StringJoiner的使用及源碼詳析

    Java1.8中StringJoiner的使用及源碼詳析

    在看String類時,看到有使用StringJoiner類,所以順便看了下StringJoiner類,下面這篇文章主要給大家介紹了關(guān)于Java 1.8中StringJoiner的使用及源碼分析的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-08-08
  • MyBatis的五種批量插入詳解

    MyBatis的五種批量插入詳解

    這篇文章主要介紹了MyBatis的五種批量插入詳解,MyBatis是一款半自動的ORM持久層框架,具有較高的SQL靈活性,支持高級映射(一對一,一對多),動態(tài)SQL,延遲加載和緩存等特性,但它的數(shù)據(jù)庫無關(guān)性較低,需要的朋友可以參考下
    2023-08-08
  • java定義數(shù)組的三種類型總結(jié)

    java定義數(shù)組的三種類型總結(jié)

    下面小編就為大家?guī)硪黄猨ava定義數(shù)組的三種類型總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • spring?boot對敏感信息進行加解密的項目實現(xiàn)

    spring?boot對敏感信息進行加解密的項目實現(xiàn)

    本文主要介紹了spring?boot對敏感信息進行加解密的項目實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java list如何根據(jù)id獲取子節(jié)點

    Java list如何根據(jù)id獲取子節(jié)點

    這篇文章主要介紹了Java list如何根據(jù)id獲取子節(jié)點,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 詳解Java中的BigDecimal

    詳解Java中的BigDecimal

    這篇文章主要介紹了Java中的BigDecimal的使用方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • java 線程池的實現(xiàn)原理、優(yōu)點與風(fēng)險、以及4種線程池實現(xiàn)

    java 線程池的實現(xiàn)原理、優(yōu)點與風(fēng)險、以及4種線程池實現(xiàn)

    這篇文章主要介紹了java 線程池的實現(xiàn)原理、優(yōu)點與風(fēng)險、以及4種線程池實現(xiàn)包括了:配置線程池大小配置,線程池的實現(xiàn)原理等,需要的朋友可以參考下
    2023-02-02
  • 詳解SpringBoot如何使用Redis和Redis緩存

    詳解SpringBoot如何使用Redis和Redis緩存

    這篇文章主要為大家詳細介紹了SpringBoot如何使用Redis和Redis緩存,文中的示例代碼講解詳細,對我們學(xué)習(xí)SpringBoot有一定的幫助,需要的可以參考一下
    2022-06-06
  • 圖解分析Javaweb進程與線程

    圖解分析Javaweb進程與線程

    這篇文章主要介紹了Javaweb進程與線程的知識,本篇文章通過簡要的案例,講解了它的基礎(chǔ)原理與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2022-03-03

最新評論