What race condition? Static variables are initialized when the class is constructed. As far as I know there is no race condition on that or Java would be hosed.
Ralph On Aug 12, 2014, at 12:07 PM, Matt Sicker <boa...@gmail.com> wrote: > Prevents multiple threads from constructing the field if they access the > class concurrently. Basically, it prevents a race condition. The alternative > is to make the field volatile and do a double-checked lock which we do in > another class somewhere. > > > On 12 August 2014 13:53, Gary Gregory <garydgreg...@gmail.com> wrote: > Hi, > > What is the justification for this extra level? > > Gary > > > -------- Original message -------- > From: mattsic...@apache.org > Date:08/11/2014 22:04 (GMT-05:00) > To: comm...@logging.apache.org > Subject: svn commit: r1617397 - > /logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java > > Author: mattsicker > Date: Tue Aug 12 02:04:38 2014 > New Revision: 1617397 > > URL: http://svn.apache.org/r1617397 > Log: > Singleton pattern > > Modified: > > logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java > > Modified: > logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java > URL: > http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java?rev=1617397&r1=1617396&r2=1617397&view=diff > ============================================================================== > --- > logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java > (original) > +++ > logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcDatabaseManager.java > Tue Aug 12 02:04:38 2014 > @@ -36,7 +36,6 @@ import org.apache.logging.log4j.core.uti > * An {@link AbstractDatabaseManager} implementation for relational > databases accessed via JDBC. > */ > public final class JdbcDatabaseManager extends AbstractDatabaseManager { > - private static final JDBCDatabaseManagerFactory FACTORY = new > JDBCDatabaseManagerFactory(); > > private final List<Column> columns; > private final ConnectionSource connectionSource; > @@ -174,10 +173,19 @@ public final class JdbcDatabaseManager e > final > ColumnConfig[] columnConfigs) { > > return AbstractDatabaseManager.getManager( > - name, new FactoryData(bufferSize, connectionSource, > tableName, columnConfigs), FACTORY > + name, new FactoryData(bufferSize, connectionSource, > tableName, columnConfigs), getFactory() > ); > } > > + // the usual lazy singleton > + private static class Holder { > + private static final JDBCDatabaseManagerFactory INSTANCE = new > JDBCDatabaseManagerFactory(); > + } > + > + private static JDBCDatabaseManagerFactory getFactory() { > + return Holder.INSTANCE; > + } > + > /** > * Encapsulates data that {@link JDBCDatabaseManagerFactory} uses to > create managers. > */ > > > > > > -- > Matt Sicker <boa...@gmail.com>