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 <[email protected]>
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;
}
}