diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingleton.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingleton.java new file mode 100644 index 0000000..b958016 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingleton.java @@ -0,0 +1,48 @@ +package top.fjy8018.designpattern.pattern.creational.singleton; + +import lombok.extern.slf4j.Slf4j; + +/** + * 懒汉式单例:延迟加载(线程不安全) + * + * @author F嘉阳 + * @date 2018-09-24 10:29 + */ +@Slf4j +public class LazySingleton { + private static LazySingleton lazySingleton = null; + + /** + * 单例模式构造器必须是屏蔽的 + */ + private LazySingleton() { + } + + /** + * 线程不安全 + * + * @return + */ + public static LazySingleton getInstance() { + if (lazySingleton == null) { + log.debug("LazySingleton实例化"); + lazySingleton = new LazySingleton(); + } + return lazySingleton; + } + + /** + * 线程不安全验证 + * + * @return + */ + public static LazySingleton getInstance2() throws InterruptedException { + if (lazySingleton == null) { + // 使用线程等待模拟复杂实例化过程,让多线程同时进入该方法 + Thread.sleep(1000); + log.debug("LazySingleton实例化"); + lazySingleton = new LazySingleton(); + } + return lazySingleton; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/MyRunnable.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/MyRunnable.java new file mode 100644 index 0000000..a2cae34 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/MyRunnable.java @@ -0,0 +1,21 @@ +package top.fjy8018.designpattern.pattern.creational.singleton; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author F嘉阳 + * @date 2018-09-24 10:53 + */ +@Slf4j +public class MyRunnable implements Runnable { + @Override + public void run() { + LazySingleton lazySingleton = null; + try { + lazySingleton = LazySingleton.getInstance2(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + log.info(Thread.currentThread().getName() + " " + lazySingleton); + } +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonTest.java new file mode 100644 index 0000000..4bc109a --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonTest.java @@ -0,0 +1,34 @@ +package top.fjy8018.designpattern.pattern.creational.singleton; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +@Slf4j +class LazySingletonTest { + + /** + * 懒汉式注重延迟加载,当使用时才实例化 + * 可以使用多线程测试方法或者通过多线程Debug方式测试 + */ + @Test + void getInstanceOneThread() { + LazySingleton lazySingleton = LazySingleton.getInstance(); + + } + + @Test + void getInstanceMutilThread() throws InterruptedException { + + Thread thread1 = new Thread(new MyRunnable()); + Thread thread2 = new Thread(new MyRunnable()); + + thread1.start(); + thread2.start(); + + Thread.sleep(3000); + log.debug("finish"); + + } +} \ No newline at end of file