Class AtomicSafeInitializer<T>
- java.lang.Object
-
- org.apache.commons.lang3.concurrent.AbstractConcurrentInitializer<T,ConcurrentException>
-
- org.apache.commons.lang3.concurrent.AtomicSafeInitializer<T>
-
- Type Parameters:
T
- the type of the object managed by this initializer class
- All Implemented Interfaces:
ConcurrentInitializer<T>
,FailableSupplier<T,ConcurrentException>
public class AtomicSafeInitializer<T> extends AbstractConcurrentInitializer<T,ConcurrentException>
A specializedConcurrentInitializer
implementation which is similar toAtomicInitializer
, but ensures that theAbstractConcurrentInitializer.initialize()
method is called only once.As
AtomicInitializer
this class is based on atomic variables, so it can create an object under concurrent access without synchronization. However, it implements an additional check to guarantee that theAbstractConcurrentInitializer.initialize()
method which actually creates the object cannot be called multiple times.Because of this additional check this implementation is slightly less efficient than
AtomicInitializer
, but if the object creation in theinitialize()
method is expensive or if multiple invocations ofinitialize()
are problematic, it is the better alternative.From its semantics this class has the same properties as
LazyInitializer
. It is a "save" implementation of the lazy initializer pattern. Comparing both classes in terms of efficiency is difficult because which one is faster depends on multiple factors. BecauseAtomicSafeInitializer
does not use synchronization at all it probably outrunsLazyInitializer
, at least under low or moderate concurrent access. Developers should run their own benchmarks on the expected target platform to decide which implementation is suitable for their specific use case.- Since:
- 3.0
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
AtomicSafeInitializer.Builder<I extends AtomicSafeInitializer<T>,T>
Builds a new instance.-
Nested classes/interfaces inherited from class org.apache.commons.lang3.concurrent.AbstractConcurrentInitializer
AbstractConcurrentInitializer.AbstractBuilder<I extends AbstractConcurrentInitializer<T,E>,T,B extends AbstractConcurrentInitializer.AbstractBuilder<I,T,B,E>,E extends java.lang.Exception>
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.concurrent.atomic.AtomicReference<AtomicSafeInitializer<T>>
factory
A guard which ensures that initialize() is called only once.private static java.lang.Object
NO_INIT
private java.util.concurrent.atomic.AtomicReference<T>
reference
Holds the reference to the managed object.-
Fields inherited from interface org.apache.commons.lang3.function.FailableSupplier
NUL
-
-
Constructor Summary
Constructors Modifier Constructor Description AtomicSafeInitializer()
Constructs a new instance.private
AtomicSafeInitializer(FailableSupplier<T,ConcurrentException> initializer, FailableConsumer<T,ConcurrentException> closer)
Constructs a new instance.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static <T> AtomicSafeInitializer.Builder<AtomicSafeInitializer<T>,T>
builder()
Creates a new builder.T
get()
Gets (and initialize, if not initialized yet) the required objectprivate T
getNoInit()
Gets the internal no-init object cast for this instance.protected ConcurrentException
getTypedException(java.lang.Exception e)
Gets an Exception with a type of E as defined by a concrete subclass of this class.boolean
isInitialized()
Tests whether this instance is initialized.-
Methods inherited from class org.apache.commons.lang3.concurrent.AbstractConcurrentInitializer
close, initialize
-
-
-
-
Field Detail
-
NO_INIT
private static final java.lang.Object NO_INIT
-
factory
private final java.util.concurrent.atomic.AtomicReference<AtomicSafeInitializer<T>> factory
A guard which ensures that initialize() is called only once.
-
reference
private final java.util.concurrent.atomic.AtomicReference<T> reference
Holds the reference to the managed object.
-
-
Constructor Detail
-
AtomicSafeInitializer
public AtomicSafeInitializer()
Constructs a new instance.
-
AtomicSafeInitializer
private AtomicSafeInitializer(FailableSupplier<T,ConcurrentException> initializer, FailableConsumer<T,ConcurrentException> closer)
Constructs a new instance.- Parameters:
initializer
- the initializer supplier called byAbstractConcurrentInitializer.initialize()
.closer
- the closer consumer called byAbstractConcurrentInitializer.close()
.
-
-
Method Detail
-
builder
public static <T> AtomicSafeInitializer.Builder<AtomicSafeInitializer<T>,T> builder()
Creates a new builder.- Type Parameters:
T
- the type of object to build.- Returns:
- a new builder.
- Since:
- 3.14.0
-
get
public final T get() throws ConcurrentException
Gets (and initialize, if not initialized yet) the required object- Returns:
- lazily initialized object
- Throws:
ConcurrentException
- if the initialization of the object causes an exception
-
getNoInit
private T getNoInit()
Gets the internal no-init object cast for this instance.
-
getTypedException
protected ConcurrentException getTypedException(java.lang.Exception e)
Gets an Exception with a type of E as defined by a concrete subclass of this class.- Specified by:
getTypedException
in classAbstractConcurrentInitializer<T,ConcurrentException>
- Parameters:
e
- The actual exception that was thrown- Returns:
- a new exception with the actual type of E, that wraps e.
-
isInitialized
public boolean isInitialized()
Tests whether this instance is initialized. Once initialized, always returns true.- Specified by:
isInitialized
in classAbstractConcurrentInitializer<T,ConcurrentException>
- Returns:
- whether this instance is initialized. Once initialized, always returns true.
- Since:
- 3.14.0
-
-