[jboss-svn-commits] JBoss Common SVN: r3293 - jboss-logmanager/trunk/src/main/java/org/jboss/logmanager.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jun 19 20:34:13 EDT 2009


Author: david.lloyd at jboss.com
Date: 2009-06-19 20:34:13 -0400 (Fri, 19 Jun 2009)
New Revision: 3293

Modified:
   jboss-logmanager/trunk/src/main/java/org/jboss/logmanager/LoggerNode.java
Log:
make logger field volatile (lockfree)

Modified: jboss-logmanager/trunk/src/main/java/org/jboss/logmanager/LoggerNode.java
===================================================================
--- jboss-logmanager/trunk/src/main/java/org/jboss/logmanager/LoggerNode.java	2009-06-18 13:51:07 UTC (rev 3292)
+++ jboss-logmanager/trunk/src/main/java/org/jboss/logmanager/LoggerNode.java	2009-06-20 00:34:13 UTC (rev 3293)
@@ -25,6 +25,7 @@
 import java.lang.ref.WeakReference;
 import java.util.Collection;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 import static org.jboss.logmanager.ConcurrentReferenceHashMap.ReferenceType.STRONG;
 import static org.jboss.logmanager.ConcurrentReferenceHashMap.ReferenceType.WEAK;
 
@@ -47,11 +48,16 @@
     private final String fullName;
 
     /**
-     * A weak reference to the logger instance.  Protected by {@code this}.
+     * A weak reference to the logger instance.  Only update using {@link #loggerRefUpdater}.
      */
-    private LoggerRef loggerRef = null;
+    private volatile LoggerRef loggerRef = null;
 
     /**
+     * The atomic updater for {@link #loggerRef}.
+     */
+    private static final AtomicReferenceFieldUpdater<LoggerNode, LoggerRef> loggerRefUpdater = AtomicReferenceFieldUpdater.newUpdater(LoggerNode.class, LoggerRef.class, "loggerRef");
+
+    /**
      * The map of names to child nodes.  The child node references are weak.
      */
     private final ConcurrentMap<String, LoggerNode> children = new ConcurrentReferenceHashMap<String, LoggerNode>(8, STRONG, WEAK);
@@ -147,14 +153,20 @@
      * @return a logger instance
      */
     Logger getOrCreateLogger() {
-        synchronized(this) {
-            Logger instance = loggerRef == null ? null : loggerRef.get();
-            if (instance == null) {
-                instance = new Logger(this, fullName);
-                loggerRef = fullName.length() == 0 ? new StrongLoggerRef(instance) : new WeakLoggerRef(instance);
-                instance.setLevel(null);
+        final String fullName = this.fullName;
+        final LoggerNode parent = this.parent;
+        for (;;) {
+            LoggerRef loggerRef = this.loggerRef;
+            if (loggerRef != null) {
+                final Logger logger = loggerRef.get();
+                if (logger != null) {
+                    return logger;
+                }
             }
-            return instance;
+            final Logger logger = new Logger(this, fullName);
+            if (loggerRefUpdater.compareAndSet(this, null, parent == null ? new StrongLoggerRef(logger) : new WeakLoggerRef(logger))) {
+                return logger;
+            }
         }
     }
 
@@ -187,7 +199,7 @@
         LoggerNode node = parent;
         while (node != null) {
             synchronized(node) {
-                final Logger instance = node.loggerRef == null ? null : node.loggerRef.get();
+                final Logger instance = node.getLogger();
                 if (instance != null) {
                     return instance;
                 }
@@ -217,12 +229,9 @@
         for (LoggerNode node : children.values()) {
             if (node != null) {
                 synchronized (node) {
-                    final LoggerRef loggerRef = node.loggerRef;
-                    if (loggerRef != null) {
-                        final Logger instance = loggerRef.get();
-                        if (instance != null) {
-                            instance.setEffectiveLevel(newLevel);
-                        }
+                    final Logger instance = node.getLogger();
+                    if (instance != null) {
+                        instance.setEffectiveLevel(newLevel);
                     }
                 }
             }




More information about the jboss-svn-commits mailing list