diff --git a/singleton/pom.xml b/singleton/pom.xml index e3d8f06e2ea5..038d6fdac040 100644 --- a/singleton/pom.xml +++ b/singleton/pom.xml @@ -38,5 +38,9 @@ junit-jupiter-engine test + + junit + junit + diff --git a/singleton/src/main/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLocking.java b/singleton/src/main/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLocking.java index a7557fda37e0..6c17f7c3f001 100644 --- a/singleton/src/main/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLocking.java +++ b/singleton/src/main/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLocking.java @@ -35,12 +35,16 @@ public final class ThreadSafeDoubleCheckLocking { private static volatile ThreadSafeDoubleCheckLocking instance; + private static boolean flag = true; + /** * private constructor to prevent client from instantiating. */ private ThreadSafeDoubleCheckLocking() { // to prevent instantiating by Reflection call - if (instance != null) { + if (flag) { + flag = false; + } else { throw new IllegalStateException("Already initialized."); } } diff --git a/singleton/src/test/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLockingTest.java b/singleton/src/test/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLockingTest.java index 1d00d9f8f624..6286b09fb2a4 100644 --- a/singleton/src/test/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLockingTest.java +++ b/singleton/src/test/java/com/iluwatar/singleton/ThreadSafeDoubleCheckLockingTest.java @@ -22,6 +22,11 @@ */ package com.iluwatar.singleton; +import org.junit.Test; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + /** * Date: 12/29/15 - 19:26 PM * @@ -36,4 +41,15 @@ public ThreadSafeDoubleCheckLockingTest() { super(ThreadSafeDoubleCheckLocking::getInstance); } + /** + * Test creating new instance by refection + */ + @Test(expected = InvocationTargetException.class) + public void testCreatingNewInstanceByRefection() throws Exception { + ThreadSafeDoubleCheckLocking instance1 = ThreadSafeDoubleCheckLocking.getInstance(); + Constructor constructor = ThreadSafeDoubleCheckLocking.class.getDeclaredConstructor(); + constructor.setAccessible(true); + ThreadSafeDoubleCheckLocking instance2 = (ThreadSafeDoubleCheckLocking) constructor.newInstance(null); + } + } \ No newline at end of file