Add DCL and Initializing on demand holder idiom.
This commit is contained in:
		| @@ -22,5 +22,14 @@ public class App { | |||||||
| 		System.out.println("threadSafeIvoryTower1=" + threadSafeIvoryTower1); | 		System.out.println("threadSafeIvoryTower1=" + threadSafeIvoryTower1); | ||||||
| 		System.out.println("threadSafeIvoryTower2=" + threadSafeIvoryTower2); | 		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