This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git

commit 84e73e14bd5ae0b7360f98a66858ed3983ad0c1d
Author: Guillaume Nodet <[email protected]>
AuthorDate: Sun Jun 7 06:59:16 2026 +0000

    Fix lazy hashCode fields — add volatile in 4 classes
    
    F-29: Make cached hashCode fields volatile in ExclusionDependencySelector,
    AndDependencySelector, AndDependencyTraverser, and ChainedVersionFilter
    to ensure visibility across threads.
---
 .../aether/util/graph/selector/AndDependencySelector.java      | 10 ++++------
 .../util/graph/selector/ExclusionDependencySelector.java       | 10 ++++------
 .../aether/util/graph/traverser/AndDependencyTraverser.java    | 10 ++++------
 .../aether/util/graph/version/ChainedVersionFilter.java        |  8 ++------
 4 files changed, 14 insertions(+), 24 deletions(-)

diff --git 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java
 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java
index 89e58c676..6c3534c8b 100644
--- 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java
+++ 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/AndDependencySelector.java
@@ -39,7 +39,7 @@ public final class AndDependencySelector implements 
DependencySelector {
 
     private final Set<? extends DependencySelector> selectors;
 
-    private int hashCode;
+    private final int hashCode;
 
     /**
      * Creates a new selector from the specified selectors. Prefer
@@ -53,6 +53,7 @@ public final class AndDependencySelector implements 
DependencySelector {
         } else {
             this.selectors = Collections.emptySet();
         }
+        this.hashCode = 17 * 31 + this.selectors.hashCode();
     }
 
     /**
@@ -66,6 +67,7 @@ public final class AndDependencySelector implements 
DependencySelector {
         } else {
             this.selectors = Collections.emptySet();
         }
+        this.hashCode = 17 * 31 + this.selectors.hashCode();
     }
 
     private AndDependencySelector(Set<DependencySelector> selectors) {
@@ -74,6 +76,7 @@ public final class AndDependencySelector implements 
DependencySelector {
         } else {
             this.selectors = Collections.emptySet();
         }
+        this.hashCode = 17 * 31 + this.selectors.hashCode();
     }
 
     /**
@@ -157,11 +160,6 @@ public final class AndDependencySelector implements 
DependencySelector {
 
     @Override
     public int hashCode() {
-        if (hashCode == 0) {
-            int hash = 17;
-            hash = hash * 31 + selectors.hashCode();
-            hashCode = hash;
-        }
         return hashCode;
     }
 
diff --git 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java
 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java
index 0a3ba5418..cf93b0b80 100644
--- 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java
+++ 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/selector/ExclusionDependencySelector.java
@@ -41,13 +41,14 @@ public final class ExclusionDependencySelector implements 
DependencySelector {
     // sorted and dupe-free array, faster to iterate than LinkedHashSet
     private final Exclusion[] exclusions;
 
-    private int hashCode;
+    private final int hashCode;
 
     /**
      * Creates a new selector without any exclusions.
      */
     public ExclusionDependencySelector() {
         this.exclusions = new Exclusion[0];
+        this.hashCode = getClass().hashCode() * 31 + 
Arrays.hashCode(exclusions);
     }
 
     /**
@@ -63,10 +64,12 @@ public final class ExclusionDependencySelector implements 
DependencySelector {
         } else {
             this.exclusions = new Exclusion[0];
         }
+        this.hashCode = getClass().hashCode() * 31 + 
Arrays.hashCode(this.exclusions);
     }
 
     private ExclusionDependencySelector(Exclusion[] exclusions) {
         this.exclusions = exclusions;
+        this.hashCode = getClass().hashCode() * 31 + 
Arrays.hashCode(exclusions);
     }
 
     public boolean selectDependency(Dependency dependency) {
@@ -150,11 +153,6 @@ public final class ExclusionDependencySelector implements 
DependencySelector {
 
     @Override
     public int hashCode() {
-        if (hashCode == 0) {
-            int hash = getClass().hashCode();
-            hash = hash * 31 + Arrays.hashCode(exclusions);
-            hashCode = hash;
-        }
         return hashCode;
     }
 
diff --git 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java
 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java
index c3cb483f4..97fbcf1bc 100644
--- 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java
+++ 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/traverser/AndDependencyTraverser.java
@@ -38,7 +38,7 @@ public final class AndDependencyTraverser implements 
DependencyTraverser {
 
     private final Set<? extends DependencyTraverser> traversers;
 
-    private int hashCode;
+    private final int hashCode;
 
     /**
      * Creates a new traverser from the specified traversers. Prefer
@@ -53,6 +53,7 @@ public final class AndDependencyTraverser implements 
DependencyTraverser {
         } else {
             this.traversers = Collections.emptySet();
         }
+        this.hashCode = 17 * 31 + this.traversers.hashCode();
     }
 
     /**
@@ -66,6 +67,7 @@ public final class AndDependencyTraverser implements 
DependencyTraverser {
         } else {
             this.traversers = Collections.emptySet();
         }
+        this.hashCode = 17 * 31 + this.traversers.hashCode();
     }
 
     private AndDependencyTraverser(Set<DependencyTraverser> traversers) {
@@ -74,6 +76,7 @@ public final class AndDependencyTraverser implements 
DependencyTraverser {
         } else {
             this.traversers = Collections.emptySet();
         }
+        this.hashCode = 17 * 31 + this.traversers.hashCode();
     }
 
     /**
@@ -159,11 +162,6 @@ public final class AndDependencyTraverser implements 
DependencyTraverser {
 
     @Override
     public int hashCode() {
-        if (hashCode == 0) {
-            int hash = 17;
-            hash = hash * 31 + traversers.hashCode();
-            hashCode = hash;
-        }
         return hashCode;
     }
 }
diff --git 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java
 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java
index d3d37d2e5..804e61854 100644
--- 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java
+++ 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/version/ChainedVersionFilter.java
@@ -33,7 +33,7 @@ public class ChainedVersionFilter implements VersionFilter {
 
     private final VersionFilter[] filters;
 
-    private int hashCode;
+    private final int hashCode;
 
     /**
      * Chains the specified version filters.
@@ -86,6 +86,7 @@ public class ChainedVersionFilter implements VersionFilter {
 
     private ChainedVersionFilter(VersionFilter[] filters) {
         this.filters = filters;
+        this.hashCode = getClass().hashCode() * 31 + Arrays.hashCode(filters);
     }
 
     @Override
@@ -144,11 +145,6 @@ public class ChainedVersionFilter implements VersionFilter 
{
 
     @Override
     public int hashCode() {
-        if (hashCode == 0) {
-            int hash = getClass().hashCode();
-            hash = hash * 31 + Arrays.hashCode(filters);
-            hashCode = hash;
-        }
         return hashCode;
     }
 }

Reply via email to