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;
   }
 }

Reply via email to