So are you going to change this back?

Ralph

On Aug 12, 2014, at 5:44 PM, Matt Sicker <boa...@gmail.com> wrote:

> 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