mirror of
https://github.com/tiennm99/java-design-patterns.git
synced 2026-05-15 03:01:12 +00:00
41 lines
1019 B
Java
41 lines
1019 B
Java
package com.iluwatar;
|
|
|
|
/**
|
|
* Double check locking
|
|
*
|
|
* http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
|
|
*
|
|
* Broken under Java 1.4.
|
|
* @author mortezaadi@gmail.com
|
|
*
|
|
*/
|
|
public class ThreadSafeDoubleCheckLocking {
|
|
|
|
private static volatile ThreadSafeDoubleCheckLocking INSTANCE;
|
|
|
|
/**
|
|
* private constructor to prevent client from instantiating.
|
|
*
|
|
*/
|
|
private ThreadSafeDoubleCheckLocking() {
|
|
//to prevent instantiating by Reflection call
|
|
if(INSTANCE != null)
|
|
throw new IllegalStateException("Already initialized.");
|
|
}
|
|
|
|
public static ThreadSafeDoubleCheckLocking getInstance() {
|
|
//local variable increases performance by 25 percent
|
|
//Joshua Bloch "Effective Java, Second Edition", p. 283-284
|
|
ThreadSafeDoubleCheckLocking result = INSTANCE;
|
|
if (result == null) {
|
|
synchronized (ThreadSafeDoubleCheckLocking.class) {
|
|
result = INSTANCE;
|
|
if (result == null) {
|
|
INSTANCE = result = new ThreadSafeDoubleCheckLocking();
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
}
|