T - the type of the object managed by this initializer classpublic class AtomicInitializer<T> extends AbstractConcurrentInitializer<T,ConcurrentException>
ConcurrentInitializer interface
based on an AtomicReference variable.
This class maintains a member field of type AtomicReference. It
implements the following algorithm to create and initialize an object in its
get() method:
AtomicReference variable contains
already a value. If this is the case, the value is directly returned.AbstractConcurrentInitializer.initialize() method is called. This method must be
defined in concrete subclasses to actually create the managed object.AbstractConcurrentInitializer.initialize() it is checked
whether the AtomicReference variable is still undefined. This has to
be done because in the meantime another thread may have initialized the
object. If the reference is still empty, the newly created object is stored
in it and returned by this method.AtomicReference is returned.
Because atomic variables are used this class does not need any
synchronization. So there is no danger of deadlock, and access to the managed
object is efficient. However, if multiple threads access the AtomicInitializer object before it has been initialized almost at the same
time, it can happen that AbstractConcurrentInitializer.initialize() is called multiple times. The
algorithm outlined above guarantees that get() always returns the
same object though.
Compared with the LazyInitializer class, this class can be more
efficient because it does not need synchronization. The drawback is that the
AbstractConcurrentInitializer.initialize() method can be called multiple times which may be
problematic if the creation of the managed object is expensive. As a rule of
thumb this initializer implementation is preferable if there are not too many
threads involved and the probability that multiple threads access an
uninitialized object is small. If there is high parallelism,
LazyInitializer is more appropriate.
| Modifier and Type | Class and Description |
|---|---|
static class |
AtomicInitializer.Builder<I extends AtomicInitializer<T>,T>
Builds a new instance.
|
AbstractConcurrentInitializer.AbstractBuilder<I extends AbstractConcurrentInitializer<T,E>,T,B extends AbstractConcurrentInitializer.AbstractBuilder<I,T,B,E>,E extends Exception>NUL| Constructor and Description |
|---|
AtomicInitializer()
Constructs a new instance.
|
| Modifier and Type | Method and Description |
|---|---|
static <T> AtomicInitializer.Builder<AtomicInitializer<T>,T> |
builder()
Creates a new builder.
|
T |
get()
Gets the object managed by this initializer.
|
protected ConcurrentException |
getTypedException(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.
|
close, initializeclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitnulpublic static <T> AtomicInitializer.Builder<AtomicInitializer<T>,T> builder()
T - the type of object to build.public T get() throws ConcurrentException
AtomicInitializerConcurrentException - if an error occurred during initialization of
the objectprotected ConcurrentException getTypedException(Exception e)
getTypedException in class AbstractConcurrentInitializer<T,ConcurrentException>e - The actual exception that was thrownpublic boolean isInitialized()
isInitialized in class AbstractConcurrentInitializer<T,ConcurrentException>Copyright © 2001–2025 The Apache Software Foundation. All rights reserved.