A specialized {@code ConcurrentInitializer} implementation which is similarto {@link AtomicInitializer}, but ensures that the {@link #initialize()}method is called only once.
As {@link AtomicInitializer} this class is based on atomic variables, so itcan create an object under concurrent access without synchronization. However, it implements an additional check to guarantee that the {@link #initialize()} method which actually creates the object cannot becalled multiple times.
Because of this additional check this implementation is slightly less efficient than {@link AtomicInitializer}, but if the object creation in the {@code initialize()} method is expensive or if multiple invocations of{@code initialize()} are problematic, it is the better alternative.
From its semantics this class has the same properties as {@link 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. Because {@code AtomicSafeInitializer} does not use synchronization at all it probablyoutruns {@link LazyInitializer}, 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 @version $Id: AtomicSafeInitializer.java 1088899 2011-04-05 05:31:27Z bayard $ @param < T> the type of the object managed by this initializer class
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|