Add DCL and Initializing on demand holder idiom.
This commit is contained in:
		| @@ -21,6 +21,15 @@ public class App { | ||||
| 				.getInstance(); | ||||
| 		System.out.println("threadSafeIvoryTower1=" + threadSafeIvoryTower1); | ||||
| 		System.out.println("threadSafeIvoryTower2=" + threadSafeIvoryTower2); | ||||
|  | ||||
| 		 | ||||
| 		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,29 @@ | ||||
| package com.iluwatar; | ||||
|  | ||||
| import java.io.Serializable; | ||||
|  | ||||
| /** | ||||
|  *  | ||||
|  * @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,36 @@ | ||||
| package com.iluwatar; | ||||
|  | ||||
| /** | ||||
|  * 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