From 644292961b900cdb0d211fa1b51332ea5a814025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Tue, 25 Sep 2018 16:33:47 +0800 Subject: [PATCH] =?UTF-8?q?ThreadLocal=E5=AE=9E=E7=8E=B0=E4=BC=AA=E5=8D=95?= =?UTF-8?q?=E4=BE=8B=E5=B9=B6=E6=B5=8B=E8=AF=95=E7=BA=BF=E7=A8=8B=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../singleton/ThreadLocalInstance.java | 28 +++++++++++ .../singleton/ThreadLocalInstanceTest.java | 46 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstance.java create mode 100644 src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstanceTest.java diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstance.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstance.java new file mode 100644 index 0000000..df45d21 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstance.java @@ -0,0 +1,28 @@ +package top.fjy8018.designpattern.pattern.creational.singleton; + +/** + * 基于{@link ThreadLocalInstance} 的(伪)单例模式,只能保证线程内单例唯一(空间换时间思想) + * + * @author F嘉阳 + * @date 2018-09-25 16:24 + */ +public class ThreadLocalInstance { + private static ThreadLocal instanceThreadLocal = new ThreadLocal() { + @Override + protected ThreadLocalInstance initialValue() { + return new ThreadLocalInstance(); + } + }; + + private ThreadLocalInstance() { + } + + /** + * 其基于{@link java.lang.ThreadLocal.ThreadLocalMap}实现,维护线程隔离,故不用指定key + * + * @return + */ + public static ThreadLocalInstance getInstance() { + return instanceThreadLocal.get(); + } +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstanceTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstanceTest.java new file mode 100644 index 0000000..da6db81 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstanceTest.java @@ -0,0 +1,46 @@ +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 ThreadLocalInstanceTest { + + /** + * {@link ThreadLocal} 只能保证在同一个线程中单例安全 + * + * @throws InterruptedException + */ + @Test + void getInstance() throws InterruptedException { + // 在主线程中取 + for (int i = 0; i < 5; i++) { + ThreadLocalInstance instance = ThreadLocalInstance.getInstance(); + log.info(Thread.currentThread().getName() + " " + instance); + } + + Thread thread1 = new Thread(new ThreadLocalInstanceTest.MyRunnable()); + Thread thread2 = new Thread(new ThreadLocalInstanceTest.MyRunnable()); + + thread1.start(); + thread2.start(); + + Thread.sleep(2000); + log.debug("finish"); + } + + private class MyRunnable implements Runnable { + @Override + public void run() { + ThreadLocalInstance instance = null; + try { + instance = ThreadLocalInstance.getInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + log.info(Thread.currentThread().getName() + " " + instance); + } + } +} \ No newline at end of file