Skip to content

Commit 43e92d3

Browse files
beiwei30chickenlj
authored andcommitted
Merge pull request #3532 from beiwei30:use-concurrent-map, avoid using synchronized.
1 parent 44348f4 commit 43e92d3

File tree

1 file changed

+6
-13
lines changed
  • dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration

1 file changed

+6
-13
lines changed

dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import java.util.List;
4949
import java.util.Map;
5050
import java.util.concurrent.ConcurrentHashMap;
51+
import java.util.concurrent.ConcurrentMap;
5152
import java.util.concurrent.ExecutorService;
5253

5354
import static java.util.concurrent.Executors.newSingleThreadExecutor;
@@ -99,7 +100,7 @@ public class RegistryProtocol implements Protocol {
99100
private final ProviderConfigurationListener providerConfigurationListener = new ProviderConfigurationListener();
100101
//To solve the problem of RMI repeated exposure port conflicts, the services that have been exposed are no longer exposed.
101102
//providerurl <--> exporter
102-
private final Map<String, ExporterChangeableWrapper<?>> bounds = new ConcurrentHashMap<>();
103+
private final ConcurrentMap<String, ExporterChangeableWrapper<?>> bounds = new ConcurrentHashMap<>();
103104
private Cluster cluster;
104105
private Protocol protocol;
105106
private RegistryFactory registryFactory;
@@ -212,19 +213,11 @@ private URL overrideUrlWithConfig(URL providerUrl, OverrideListener listener) {
212213
@SuppressWarnings("unchecked")
213214
private <T> ExporterChangeableWrapper<T> doLocalExport(final Invoker<T> originInvoker, URL providerUrl) {
214215
String key = getCacheKey(originInvoker);
215-
ExporterChangeableWrapper<T> exporter = (ExporterChangeableWrapper<T>) bounds.get(key);
216-
if (exporter == null) {
217-
synchronized (bounds) {
218-
exporter = (ExporterChangeableWrapper<T>) bounds.get(key);
219-
if (exporter == null) {
220216

221-
final Invoker<?> invokerDelegete = new InvokerDelegate<T>(originInvoker, providerUrl);
222-
exporter = new ExporterChangeableWrapper<T>((Exporter<T>) protocol.export(invokerDelegete), originInvoker);
223-
bounds.put(key, exporter);
224-
}
225-
}
226-
}
227-
return exporter;
217+
return (ExporterChangeableWrapper<T>) bounds.computeIfAbsent(key, s -> {
218+
Invoker<?> invokerDelegete = new InvokerDelegate<>(originInvoker, providerUrl);
219+
return new ExporterChangeableWrapper<>((Exporter<T>) protocol.export(invokerDelegete), originInvoker);
220+
});
228221
}
229222

230223
public <T> void reExport(final Invoker<T> originInvoker, URL newInvokerUrl) {

0 commit comments

Comments
 (0)