On Wed, Aug 13, 2014 at 1:31 PM, Matt Sicker <boa...@gmail.com> wrote:
> > 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. > Matt, please do undo when you do get a chance. Gary > > 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> 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> >> >> >> > > -- > Matt Sicker <boa...@gmail.com> > -- E-Mail: garydgreg...@gmail.com | ggreg...@apache.org Java Persistence with Hibernate, Second Edition <http://www.manning.com/bauer3/> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> Spring Batch in Action <http://www.manning.com/templier/> Blog: http://garygregory.wordpress.com Home: http://garygregory.com/ Tweet! http://twitter.com/GaryGregory