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

> So are you going to change this back?
>
> Yeah I'll revert it unless someone else snags it first. I won't be at a
computer for several hours, though.

I would note that this is my relic of old Java development. Similar to the
calls of size() > 0 instead of isEmpty() you still find all over the place.


> Ralph
>
> On Aug 12, 2014, at 5:44 PM, Matt Sicker <boa...@gmail.com
> <javascript:_e(%7B%7D,'cvml','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
> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','garydgreg...@gmail.com');>> wrote:
>>
>>> Hi,
>>>
>>> What is the justification for this extra level?
>>>
>>> Gary
>>>
>>>
>>> -------- Original message --------
>>> From: mattsic...@apache.org
>>> <javascript:_e(%7B%7D,'cvml','mattsic...@apache.org');>
>>> Date:08/11/2014 22:04 (GMT-05:00)
>>> To: comm...@logging.apache.org
>>> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','boa...@gmail.com');>>
>>
>>
>>
>>
>>
>>
>
>
> --
> Matt Sicker <boa...@gmail.com
> <javascript:_e(%7B%7D,'cvml','boa...@gmail.com');>>
>
>
>

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

Reply via email to