Oh my bad, I mixed up lazy singleton and eager singleton.

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

> Finally, see
> http://en.wikipedia.org/wiki/Singleton_pattern#Eager_initialization.
>  This was the prior pattern which is clearly thread safe.
>
> Ralph
>
> On Aug 12, 2014, at 3:40 PM, Ralph Goers <ralph.go...@dslextreme.com>
> wrote:
>
> Let me put it another way.
>
> If your intent is that the factory should only be created when getManager
> is called vs when AbstractDataManager is loaded then your change is fine.
>  However, I am not sure there is any benefit to that since I would expect
> every access to AbstractDataManager to be immediately followed by a call to
> getManager.
>
> From what I can see the previous code was not vulnerable to any race
> conditions.
>
> Ralph
>
> On Aug 12, 2014, at 3:33 PM, Ralph Goers <ralph.go...@dslextreme.com>
> wrote:
>
> So you are saying static initializers in a class can be executed multiple
> times?  If so I certainly wasn’t aware of that and I would think a few
> pieces of code would need modification.  Before I go searching can you
> point to something that says it works that way?
>
> When I read
> http://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom it
> indicates that static initialization IS guaranteed to be serial, in which
> case the holder pattern is not needed for this.  That pattern is for when
> you want lazy initialization, not for guaranteeing a static variable is
> only initialized once.
>
> Ralph
>
> On Aug 12, 2014, at 1:13 PM, 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