Merge pull request #478 from iluwatar/DocumentDoubleCheckIdiom
Documented singleton double check idiom
This commit is contained in:
commit
d50139e13e
@ -53,11 +53,20 @@ public final class ThreadSafeDoubleCheckLocking {
|
|||||||
public static ThreadSafeDoubleCheckLocking getInstance() {
|
public static ThreadSafeDoubleCheckLocking getInstance() {
|
||||||
// local variable increases performance by 25 percent
|
// local variable increases performance by 25 percent
|
||||||
// Joshua Bloch "Effective Java, Second Edition", p. 283-284
|
// Joshua Bloch "Effective Java, Second Edition", p. 283-284
|
||||||
|
|
||||||
ThreadSafeDoubleCheckLocking result = instance;
|
ThreadSafeDoubleCheckLocking result = instance;
|
||||||
|
// Check if singleton instance is initialized. If it is initialized then we can return the instance.
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
|
// It is not initialized but we cannot be sure because some other thread might have initialized it
|
||||||
|
// in the meanwhile. So to make sure we need to lock on an object to get mutual exclusion.
|
||||||
synchronized (ThreadSafeDoubleCheckLocking.class) {
|
synchronized (ThreadSafeDoubleCheckLocking.class) {
|
||||||
|
// Again assign the instance to local variable to check if it was initialized by some other thread
|
||||||
|
// while current thread was blocked to enter the locked zone. If it was initialized then we can
|
||||||
|
// return the previously created instance just like the previous null check.
|
||||||
result = instance;
|
result = instance;
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
|
// The instance is still not initialized so we can safely (no other thread can enter this zone)
|
||||||
|
// create an instance and make it our singleton instance.
|
||||||
instance = result = new ThreadSafeDoubleCheckLocking();
|
instance = result = new ThreadSafeDoubleCheckLocking();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user