Merge branch 'master' of https://github.com/mortezaadi/java-design-patterns into mortezaadi-master
Conflicts: singleton/src/main/java/com/iluwatar/App.java
This commit is contained in:
		@@ -31,5 +31,15 @@ public class App {
 | 
			
		||||
		EnumIvoryTower enumIvoryTower2 = EnumIvoryTower.INSTANCE;
 | 
			
		||||
		System.out.println("enumIvoryTower1=" + enumIvoryTower1);
 | 
			
		||||
		System.out.println("enumIvoryTower2=" + enumIvoryTower2);
 | 
			
		||||
		
 | 
			
		||||
		InitializingOnDemandHolderIdiom demandHolderIdiom = InitializingOnDemandHolderIdiom.getInstance();
 | 
			
		||||
		System.out.println(demandHolderIdiom);
 | 
			
		||||
		InitializingOnDemandHolderIdiom demandHolderIdiom2 = InitializingOnDemandHolderIdiom.getInstance();
 | 
			
		||||
		System.out.println(demandHolderIdiom2);
 | 
			
		||||
		
 | 
			
		||||
		ThreadSafeDoubleCheckLocking dcl1 = ThreadSafeDoubleCheckLocking.getInstance();
 | 
			
		||||
		System.out.println(dcl1);
 | 
			
		||||
		ThreadSafeDoubleCheckLocking dcl2 = ThreadSafeDoubleCheckLocking.getInstance();
 | 
			
		||||
		System.out.println(dcl2);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,36 @@
 | 
			
		||||
package com.iluwatar;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The Initialize-on-demand-holder idiom is a secure way of 
 | 
			
		||||
 * creating lazy initialize singleton Object in Java.
 | 
			
		||||
 * refer to "The CERT Oracle Secure Coding Standard for Java"
 | 
			
		||||
 * By Dhruv Mohindra, Robert C. Seacord p.378
 | 
			
		||||
 * 
 | 
			
		||||
 * Singleton objects usually are heavy to create and sometimes need to serialize them.
 | 
			
		||||
 * This class also shows how to preserve singleton in Serialized version of singleton.
 | 
			
		||||
 * 
 | 
			
		||||
 * @author mortezaadi@gmail.com
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
public class InitializingOnDemandHolderIdiom implements Serializable{
 | 
			
		||||
 | 
			
		||||
	private static final long serialVersionUID = 1L;
 | 
			
		||||
 | 
			
		||||
	private static class HelperHolder {
 | 
			
		||||
		public static final InitializingOnDemandHolderIdiom INSTANCE = new InitializingOnDemandHolderIdiom();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static InitializingOnDemandHolderIdiom getInstance() {
 | 
			
		||||
		return HelperHolder.INSTANCE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private InitializingOnDemandHolderIdiom() {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected Object readResolve() {
 | 
			
		||||
		return getInstance();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,40 @@
 | 
			
		||||
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;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user