It's a rare problem, but if two threads attempt to initialize a class for
the first time, two instances of the singleton may end up being created.
However, using this pattern, the only possible access point to create the
singleton is through the Holder class which will only be called once in
this pattern.


On 12 August 2014 15:13, Ralph Goers <ralph.go...@dslextreme.com> wrote:

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


-- 
Matt Sicker <boa...@gmail.com>

Reply via email to