List<T> () { PersistentList<T> result = cache; if (result != null) { return result; } // it is ok to call getExtensionPoint several times - call is cheap, and implementation is thread-safe ExtensionPoint<T> extensionPoint = this.extensionPoint; if (extensionPoint == null) { extensionPoint = extensionPointSupplier.get(); this.extensionPoint = extensionPoint; } PersistentList<T> extensions = toPersistentList(extensionPoint.getExtensionList()); synchronized (lock) { result = cache; if (result != null) { return result; } // EP will not add duplicated listener, so, it is safe to not care about is already added extensionPoint.addExtensionPointListener(extensionPointAndAreaListener, false, null); result = explicitExtensions.isEmpty() ? extensions : explicitExtensions.addAll(extensions); cache = result; return result; } }