From dbc1ca7aebd26bd51df6f6ca5e7ad97f9df56a20 Mon Sep 17 00:00:00 2001 From: mortezaadi Date: Fri, 5 Dec 2014 00:02:50 +0330 Subject: [PATCH] Add DCL and Initializing on demand holder idiom. --- singleton/src/main/java/com/iluwatar/App.java | 11 +++++- .../InitializingOnDemandHolderIdiom.java | 29 +++++++++++++++ .../ThreadSafeDoubleCheckLocking.java | 36 +++++++++++++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 singleton/src/main/java/com/iluwatar/InitializingOnDemandHolderIdiom.java create mode 100644 singleton/src/main/java/com/iluwatar/ThreadSafeDoubleCheckLocking.java diff --git a/singleton/src/main/java/com/iluwatar/App.java b/singleton/src/main/java/com/iluwatar/App.java index 4a3fcf361..a291b3861 100644 --- a/singleton/src/main/java/com/iluwatar/App.java +++ b/singleton/src/main/java/com/iluwatar/App.java @@ -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); } } diff --git a/singleton/src/main/java/com/iluwatar/InitializingOnDemandHolderIdiom.java b/singleton/src/main/java/com/iluwatar/InitializingOnDemandHolderIdiom.java new file mode 100644 index 000000000..0624b9b96 --- /dev/null +++ b/singleton/src/main/java/com/iluwatar/InitializingOnDemandHolderIdiom.java @@ -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(); + } + +} diff --git a/singleton/src/main/java/com/iluwatar/ThreadSafeDoubleCheckLocking.java b/singleton/src/main/java/com/iluwatar/ThreadSafeDoubleCheckLocking.java new file mode 100644 index 000000000..47eafc52d --- /dev/null +++ b/singleton/src/main/java/com/iluwatar/ThreadSafeDoubleCheckLocking.java @@ -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; + } +}