switching to java.util.ConcurrentHashMap in jps code; eliminate unneeded map queries

This commit is contained in:
Eugene Zhuravlev
2013-11-26 22:35:42 +01:00
parent 740725dc2c
commit 01ef080d23
5 changed files with 27 additions and 22 deletions
@@ -15,17 +15,17 @@
*/
package org.jetbrains.jps.service.impl;
import com.intellij.util.containers.ConcurrentHashMap;
import org.jetbrains.jps.service.JpsServiceManager;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author nik
*/
public class JpsServiceManagerImpl extends JpsServiceManager {
private final ConcurrentHashMap<Class, Object> myServices = new ConcurrentHashMap<Class, Object>();
private final ConcurrentHashMap<Class, List<?>> myExtensions = new ConcurrentHashMap<Class, List<?>>();
private final ConcurrentHashMap<Class, Object> myServices = new ConcurrentHashMap<Class, Object>(16, 0.75f, 1);
private final ConcurrentHashMap<Class, List<?>> myExtensions = new ConcurrentHashMap<Class, List<?>>(16, 0.75f, 1);
@Override
public <T> T getService(Class<T> serviceClass) {
@@ -36,14 +36,16 @@ public class JpsServiceManagerImpl extends JpsServiceManager {
if (!iterator.hasNext()) {
throw new ServiceConfigurationError("Implementation for " + serviceClass + " not found");
}
service = iterator.next();
final T loadedService = iterator.next();
if (iterator.hasNext()) {
throw new ServiceConfigurationError(
"More than one implementation for " + serviceClass + " found: " + service.getClass() + " and " + iterator.next().getClass());
"More than one implementation for " + serviceClass + " found: " + loadedService.getClass() + " and " + iterator.next().getClass());
}
myServices.putIfAbsent(serviceClass, service);
//noinspection unchecked
service = (T)myServices.get(serviceClass);
service = (T)myServices.putIfAbsent(serviceClass, loadedService);
if (service == null) {
service = loadedService;
}
}
return service;
}
@@ -53,12 +55,14 @@ public class JpsServiceManagerImpl extends JpsServiceManager {
List<?> cached = myExtensions.get(extensionClass);
if (cached == null) {
final ServiceLoader<T> loader = ServiceLoader.load(extensionClass, extensionClass.getClassLoader());
List<T> extensions = new ArrayList<T>();
final List<T> extensions = new ArrayList<T>();
for (T t : loader) {
extensions.add(t);
}
myExtensions.putIfAbsent(extensionClass, extensions);
cached = myExtensions.get(extensionClass);
cached = myExtensions.putIfAbsent(extensionClass, extensions);
if (cached == null) {
cached = extensions;
}
}
//noinspection unchecked
return (List<T>)cached;