You could do:
```
DistributedObject old = proxies.putIfAbsent(name, proxy);
if (old == null && initialize && proxy instanceof InitializingObject) {
  try {
    ((InitializingObject) proxy).initialize();
  } catch (...) {
  }
} else {
  proxy = old;
}
```

This way no recursive call at all is needed even if two calls try to create the same proxy at once.