diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java index 49abfd3f0..47f7406f2 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java @@ -513,7 +513,8 @@ static final class GraphKey { this.traverser = traverser; this.filter = filter; - hashCode = Objects.hash(artifact, repositories, selector, manager, traverser, filter); + hashCode = + Objects.hash(artifact, repositories, selector, System.identityHashCode(manager), traverser, filter); } @Override diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java index 34718c2c8..fb3258f35 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java @@ -119,11 +119,11 @@ public class BfDependencyCollector extends DependencyCollectorDelegate { public static final String CONFIG_PROP_THREADS = CONFIG_PROPS_PREFIX + "threads"; /** - * The default value for {@link #CONFIG_PROP_THREADS}, default value 5. + * The default value for {@link #CONFIG_PROP_THREADS}, default value {@code Runtime.getRuntime().availableProcessors()}. * * @since 1.9.0 */ - public static final int DEFAULT_THREADS = 5; + public static final int DEFAULT_THREADS = Runtime.getRuntime().availableProcessors(); @Inject public BfDependencyCollector( @@ -470,7 +470,7 @@ private ArtifactDescriptorResult resolveDescriptorForVersion( } static class ParallelDescriptorResolver implements Closeable { - private final ExecutorService executorService; + private static volatile ExecutorService executorService; /** * Artifact ID -> Future of DescriptorResolutionResult @@ -478,11 +478,20 @@ static class ParallelDescriptorResolver implements Closeable { private final Map> results = new ConcurrentHashMap<>(256); ParallelDescriptorResolver(int threads) { - this.executorService = ExecutorUtils.threadPool(threads, getClass().getSimpleName() + "-"); + if (executorService == null) { + synchronized (ParallelDescriptorResolver.class) { + if (executorService == null) { + // create only once, so that we can reuse it across multiple instances of this class + // and avoid creating too many threads / recreating it for too many times + executorService = ExecutorUtils.threadPool( + threads, ParallelDescriptorResolver.class.getSimpleName() + "-"); + } + } + } } void resolveDescriptors(Artifact artifact, Callable callable) { - results.computeIfAbsent(ArtifactIdUtils.toId(artifact), key -> this.executorService.submit(callable)); + results.computeIfAbsent(ArtifactIdUtils.toId(artifact), key -> executorService.submit(callable)); } void cacheVersionRangeDescriptor(Artifact artifact, DescriptorResolutionResult resolutionResult) { @@ -494,9 +503,7 @@ Future find(Artifact artifact) { } @Override - public void close() { - executorService.shutdown(); - } + public void close() {} } static class DoneFuture implements Future { diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/AbstractDependencyManager.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/AbstractDependencyManager.java index 90bb3c1eb..42f3512ac 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/AbstractDependencyManager.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/AbstractDependencyManager.java @@ -74,7 +74,7 @@ public abstract class AbstractDependencyManager implements DependencyManager { protected final SystemDependencyScope systemDependencyScope; - private final int hashCode; + private volatile long hashCode = Long.MAX_VALUE; protected AbstractDependencyManager(int deriveUntil, int applyFrom, ScopeManager scopeManager) { this( @@ -112,16 +112,6 @@ protected AbstractDependencyManager( this.managedExclusions = requireNonNull(managedExclusions); // nullable: if using scope manager, but there is no system scope defined this.systemDependencyScope = systemDependencyScope; - - this.hashCode = Objects.hash( - depth, - deriveUntil, - applyFrom, - managedVersions, - managedScopes, - managedOptionals, - managedLocalPaths, - managedExclusions); } protected abstract DependencyManager newInstance( @@ -332,7 +322,20 @@ public boolean equals(Object obj) { @Override public int hashCode() { - return hashCode; + if (this.hashCode != Long.MAX_VALUE) { + return (int) hashCode; + } + int result = Objects.hash( + depth, + deriveUntil, + applyFrom, + managedVersions, + managedScopes, + managedOptionals, + managedLocalPaths, + managedExclusions); + this.hashCode = result; + return result; } protected static class Key { diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/MMap.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/MMap.java index af7aa34cf..3593df535 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/MMap.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/MMap.java @@ -80,11 +80,10 @@ public boolean equals(Object o) { } private static class DoneMMap extends MMap { - private final int hashCode; + private volatile long hashCode = Long.MAX_VALUE; private DoneMMap(HashMap delegate) { super(delegate); - this.hashCode = delegate.hashCode(); } @Override @@ -99,7 +98,12 @@ public MMap done() { @Override public int hashCode() { - return hashCode; + if (this.hashCode != Long.MAX_VALUE) { + return (int) hashCode; + } + int result = delegate.hashCode(); + this.hashCode = result; + return result; } @Override