From 90bbe74f2af982d2325f2a1e821c812c8bd59f8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Mon, 24 Sep 2018 11:10:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=87=92=E6=B1=89=E5=8D=95=E4=BE=8B=E3=80=81sy?= =?UTF-8?q?nchronized=E7=A1=AE=E4=BF=9D=E7=BA=BF=E7=A8=8B=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E6=B5=8B=E8=AF=95=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../singleton/LazySingletonSynchronized.java | 52 +++++++++++++++++++ .../creational/singleton/MyRunnable.java | 21 -------- .../LazySingletonSynchronizedTest.java | 40 ++++++++++++++ .../singleton/LazySingletonTest.java | 13 +++++ 4 files changed, 105 insertions(+), 21 deletions(-) create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonSynchronized.java delete mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/MyRunnable.java create mode 100644 src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonSynchronizedTest.java diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonSynchronized.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonSynchronized.java new file mode 100644 index 0000000..7b07f5a --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonSynchronized.java @@ -0,0 +1,52 @@ +package top.fjy8018.designpattern.pattern.creational.singleton; + +import lombok.extern.slf4j.Slf4j; + +/** + * 懒汉式单例:延迟加载(线程安全) + * + * @author F嘉阳 + * @date 2018-09-24 10:29 + */ +@Slf4j +public class LazySingletonSynchronized { + private static LazySingletonSynchronized lazySingleton = null; + + /** + * 单例模式构造器必须是屏蔽的 + */ + private LazySingletonSynchronized() { + } + + /** + * synchronized确保线程安全 + * synchronized用于静态方法是对class文件加锁,用于普通方法则是对堆内存中的实例方法加锁 + * synchronized(LazySingletonSynchronized.class)与在方法名上加锁效果一致 + * + * @return + */ + public static LazySingletonSynchronized getInstance() { + synchronized (LazySingletonSynchronized.class) { + if (lazySingleton == null) { + log.debug("LazySingletonSynchronized实例化"); + lazySingleton = new LazySingletonSynchronized(); + } + } + return lazySingleton; + } + + /** + * 线程安全验证 + * + * @return + */ + public synchronized static LazySingletonSynchronized getInstance2() throws InterruptedException { + if (lazySingleton == null) { + // 使用线程等待模拟复杂实例化过程,让多线程同时进入该方法 + Thread.sleep(1000); + log.debug("LazySingletonSynchronized实例化"); + lazySingleton = new LazySingletonSynchronized(); + } + 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 deleted file mode 100644 index a2cae34..0000000 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/MyRunnable.java +++ /dev/null @@ -1,21 +0,0 @@ -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/LazySingletonSynchronizedTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonSynchronizedTest.java new file mode 100644 index 0000000..9116539 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonSynchronizedTest.java @@ -0,0 +1,40 @@ +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 LazySingletonSynchronizedTest { + + @Test + void getInstance() { + LazySingletonSynchronized.getInstance(); + } + + @Test + void getInstance2() throws InterruptedException { + Thread thread1 = new Thread(new LazySingletonSynchronizedTest.MyRunnable()); + Thread thread2 = new Thread(new LazySingletonSynchronizedTest.MyRunnable()); + + thread1.start(); + thread2.start(); + + Thread.sleep(3000); + log.debug("finish"); + } + + private class MyRunnable implements Runnable { + @Override + public void run() { + LazySingletonSynchronized lazySingleton = null; + try { + lazySingleton = LazySingletonSynchronized.getInstance2(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + log.info(Thread.currentThread().getName() + " " + lazySingleton); + } + } +} \ No newline at end of file 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 index 4bc109a..75e7f99 100644 --- a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonTest.java +++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonTest.java @@ -31,4 +31,17 @@ class LazySingletonTest { log.debug("finish"); } + + private 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); + } + } } \ No newline at end of file