Fix problems with concurrency.
This commit is contained in:
parent
c797190f5a
commit
b2e8e0c5b9
@ -4,7 +4,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = 'com.jessebrault.di'
|
group = 'com.jessebrault.di'
|
||||||
version = '0.1.0'
|
version = '0.2.0-SNAPSHOT'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
|
|
||||||
import java.lang.reflect.*;
|
import java.lang.reflect.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ -104,20 +105,15 @@ public abstract class AbstractInjectingObjectFactory implements ObjectFactory {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Map<Class<?>, Constructor<?>[]> cachedAllConstructors = new HashMap<>();
|
private final Map<Class<?>, Constructor<?>[]> cachedAllConstructors = new ConcurrentHashMap<>();
|
||||||
private final Collection<CachedInjectConstructor<?>> cachedInjectConstructors = new ArrayList<>();
|
private final Map<Class<?>, Constructor<?>> cachedInjectConstructors = new ConcurrentHashMap<>();
|
||||||
private final Collection<CachedNonInjectConstructor<?>> cachedNonInjectConstructors = new ArrayList<>();
|
private final Map<Class<?>, Map<Class<?>[], Constructor<?>>> cachedNonInjectConstructors = new ConcurrentHashMap<>();
|
||||||
private final Map<Class<?>, Collection<Method>> cachedSetters = new HashMap<>();
|
private final Map<Class<?>, Collection<Method>> cachedSetters = new ConcurrentHashMap<>();
|
||||||
private final Map<Method, Parameter> cachedSetterParameters = new HashMap<>();
|
private final Map<Method, Parameter> cachedSetterParameters = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private <T> @Nullable Constructor<T> findCachedInjectConstructor(Class<T> clazz) {
|
private <T> @Nullable Constructor<T> findCachedInjectConstructor(Class<T> clazz) {
|
||||||
for (final CachedInjectConstructor<?> cachedConstructor : this.cachedInjectConstructors) {
|
return (Constructor<T>) this.cachedInjectConstructors.get(clazz);
|
||||||
if (clazz.equals(cachedConstructor.clazz())) {
|
|
||||||
return (Constructor<T>) cachedConstructor.constructor();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -153,15 +149,14 @@ public abstract class AbstractInjectingObjectFactory implements ObjectFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected final void putCachedInjectConstructor(CachedInjectConstructor<?> cached) {
|
protected final void putCachedInjectConstructor(CachedInjectConstructor<?> cached) {
|
||||||
this.cachedInjectConstructors.add(cached);
|
this.cachedInjectConstructors.put(cached.clazz(), cached.constructor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private <T> @Nullable Constructor<T> findCachedNonInjectConstructor(Class<T> clazz, Class<?>[] paramTypes) {
|
private <T> @Nullable Constructor<T> findCachedNonInjectConstructor(Class<T> clazz, Class<?>[] paramTypes) {
|
||||||
for (final CachedNonInjectConstructor<?> cachedConstructor : this.cachedNonInjectConstructors) {
|
final Map<Class<?>[], Constructor<?>> constructors = this.cachedNonInjectConstructors.get(clazz);
|
||||||
if (clazz.equals(cachedConstructor.clazz()) && Arrays.equals(cachedConstructor.paramTypes(), paramTypes)) {
|
if (constructors != null) {
|
||||||
return (Constructor<T>) cachedConstructor.constructor();
|
return (Constructor<T>) constructors.get(paramTypes);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -209,7 +204,10 @@ public abstract class AbstractInjectingObjectFactory implements ObjectFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected final void putCachedNonInjectConstructor(CachedNonInjectConstructor<?> cached) {
|
protected final void putCachedNonInjectConstructor(CachedNonInjectConstructor<?> cached) {
|
||||||
this.cachedNonInjectConstructors.add(cached);
|
final Map<Class<?>[], Constructor<?>> constructors = this.cachedNonInjectConstructors.computeIfAbsent(
|
||||||
|
cached.clazz(), clazz -> new HashMap<>()
|
||||||
|
);
|
||||||
|
constructors.put(cached.paramTypes(), cached.constructor());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user