This is an automated email from the ASF dual-hosted git repository. dlmarion pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/accumulo-access.git
The following commit(s) were added to refs/heads/main by this push: new a3387df Removed double check locking in AccessExpressionImpl.parse (#86) a3387df is described below commit a3387df84083139c49c39503df57f80818e78e5e Author: Dave Marion <dlmar...@apache.org> AuthorDate: Thu Feb 13 12:21:40 2025 -0500 Removed double check locking in AccessExpressionImpl.parse (#86) --- .../apache/accumulo/access/AccessExpressionImpl.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/apache/accumulo/access/AccessExpressionImpl.java b/src/main/java/org/apache/accumulo/access/AccessExpressionImpl.java index 5dbddfd..914e14a 100644 --- a/src/main/java/org/apache/accumulo/access/AccessExpressionImpl.java +++ b/src/main/java/org/apache/accumulo/access/AccessExpressionImpl.java @@ -20,6 +20,8 @@ package org.apache.accumulo.access; import static java.nio.charset.StandardCharsets.UTF_8; +import java.util.concurrent.atomic.AtomicReference; + final class AccessExpressionImpl extends AccessExpression { private static final long serialVersionUID = 1L; @@ -27,7 +29,7 @@ final class AccessExpressionImpl extends AccessExpression { public static final AccessExpression EMPTY = new AccessExpressionImpl(""); private final String expression; - private volatile ParsedAccessExpression parsed = null; + private final AtomicReference<ParsedAccessExpression> parseTreeRef = new AtomicReference<>(); AccessExpressionImpl(String expression) { validate(expression); @@ -46,13 +48,14 @@ final class AccessExpressionImpl extends AccessExpression { @Override public ParsedAccessExpression parse() { - if (parsed == null) { - synchronized (this) { - if (parsed == null) { - parsed = ParsedAccessExpressionImpl.parseExpression(expression.getBytes(UTF_8)); - } - } + ParsedAccessExpression parseTree = parseTreeRef.get(); + if (parseTree == null) { + parseTreeRef.compareAndSet(null, + ParsedAccessExpressionImpl.parseExpression(expression.getBytes(UTF_8))); + // must get() again in case another thread won w/ the compare and set, this ensures this + // method always returns the exact same object + parseTree = parseTreeRef.get(); } - return parsed; + return parseTree; } }