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 <[email protected]> wrote:

> Hi,
>
> What is the justification for this extra level?
>
> Gary
>
>
> -------- Original message --------
> From: [email protected]
> Date:08/11/2014 22:04 (GMT-05:00)
> To: [email protected]
> 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 <[email protected]>

Reply via email to