[SCB-2327]discovery first pull not properly synchronized and may result in empty instance (#2536)

diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
index 625db29..43a9f9a 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterDiscovery.java
@@ -98,6 +98,8 @@
 
   private boolean started = false;
 
+  private final Object lock = new Object();
+
   public ServiceCenterDiscovery(ServiceCenterClient serviceCenterClient, EventBus eventBus) {
     super("service-center-discovery-task");
     this.serviceCenterClient = serviceCenterClient;
@@ -124,19 +126,22 @@
     }
   }
 
-  public void register(SubscriptionKey subscriptionKey) {
-    this.instancesCache.computeIfAbsent(subscriptionKey, (key) -> new SubscriptionValue());
-    pullInstance(subscriptionKey, this.instancesCache.get(subscriptionKey));
+  public void registerIfNotPresent(SubscriptionKey subscriptionKey) {
+    if (this.instancesCache.get(subscriptionKey) == null) {
+      synchronized (lock) {
+        if (this.instancesCache.get(subscriptionKey) == null) {
+          SubscriptionValue value = new SubscriptionValue();
+          pullInstance(subscriptionKey, value);
+          this.instancesCache.put(subscriptionKey, value);
+        }
+      }
+    }
   }
 
   public List<MicroserviceInstance> getInstanceCache(SubscriptionKey key) {
     return this.instancesCache.get(key).instancesCache;
   }
 
-  public boolean isRegistered(SubscriptionKey key) {
-    return this.instancesCache.get(key) != null;
-  }
-
   @Subscribe
   public void onPullInstanceEvent(PullInstanceEvent event) {
     pullAllInstance();
diff --git a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java
index d64dc24..ef523b2 100644
--- a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java
+++ b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java
@@ -133,7 +133,7 @@
     ServiceCenterDiscovery discovery = new ServiceCenterDiscovery(serviceCenterClient, eventBus);
     discovery.updateMyselfServiceId(microservice.getServiceId());
     discovery.startDiscovery();
-    discovery.register(new SubscriptionKey(microservice.getAppId(), microservice.getServiceName()));
+    discovery.registerIfNotPresent(new SubscriptionKey(microservice.getAppId(), microservice.getServiceName()));
     discoveryCounter.await(30000, TimeUnit.MILLISECONDS);
     TestMgr.check(instances != null, true);
     TestMgr.check(instances.size(), 1);