From f1410337b570c6d444e98713036d13b53bdefe68 Mon Sep 17 00:00:00 2001 From: Adrian Yao Date: Sun, 8 Sep 2019 02:13:15 +0800 Subject: [PATCH] Fix issue #761: ThreadSafeDoubleCheckLocking.java: Instantiating by Reflection call will be successful if you do that firstly (#920) --- singleton/pom.xml | 4 ++++ .../singleton/ThreadSafeDoubleCheckLocking.java | 6 +++++- .../ThreadSafeDoubleCheckLockingTest.java | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/singleton/pom.xml b/singleton/pom.xml index e3d8f06e2..038d6fdac 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 a7557fda3..6c17f7c3f 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 1d00d9f8f..6286b09fb 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 class ThreadSafeDoubleCheckLockingTest extends SingletonTest