ThreadLocal应用-使用ThreadLocal做线程缓存变量池
生活随笔
收集整理的這篇文章主要介紹了
ThreadLocal应用-使用ThreadLocal做线程缓存变量池
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
多線程環境下,或者web環境下,可以使用ThreadLocal做變量池用
import java.util.HashMap; import java.util.Map;public abstract class AbstractThreadContext {public AbstractThreadContext() {}abstract ThreadLocal<Map<String, Object>> getThreadContext();public void set(final String key, final Object value) {ThreadLocal<Map<String, Object>> threadContext = this.getThreadContext();Map<String, Object> map = (Map)threadContext.get();if (map == null) {map = new HashMap();}((Map)map).put(key, value);threadContext.set(map);}public void removeKey(String key) {ThreadLocal<Map<String, Object>> threadContext = this.getThreadContext();Map<String, Object> map = (Map)threadContext.get();if (map == null) {map = new HashMap();}((Map)map).remove(key);threadContext.set(map);}public Object get(String key) {ThreadLocal<Map<String, Object>> threadContext = this.getThreadContext();Map<String, Object> map = (Map)threadContext.get();return map == null ? null : map.get(key);}public void clean() {ThreadLocal<Map<String, Object>> threadContext = this.getThreadContext();Map<String, Object> map = (Map)threadContext.get();if (map != null) {map.clear();threadContext.set(map);}} } import java.util.Map;public final class ThreadContextStoreUtil extends AbstractThreadContext {private static ThreadLocal<Map<String, Object>> threadContext = new ThreadLocal();private static volatile ThreadContextStoreUtil app = null;private ThreadContextStoreUtil() {}public static synchronized ThreadContextStoreUtil getInstance() {if (app == null) {Class var0 = ThreadContextStoreUtil.class;synchronized(ThreadContextStoreUtil.class) {if (app == null) {app = new ThreadContextStoreUtil();}}}return app;}@Overrideprotected ThreadLocal<Map<String, Object>> getThreadContext() {return threadContext;} } public class ThreadMain {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {ThreadContextStoreUtil.getInstance().set("1", "1");ThreadContextStoreUtil.getInstance().set("2", "11");ThreadContextStoreUtil.getInstance().set("3", "111");System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("1"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("2"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("3"));}}, "a").start();new Thread(new Runnable() {@Overridepublic void run() {ThreadContextStoreUtil.getInstance().set("1", "2");ThreadContextStoreUtil.getInstance().set("2", "22");ThreadContextStoreUtil.getInstance().set("3", "222");System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("1"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("2"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("3"));}}, "b").start();new Thread(new Runnable() {@Overridepublic void run() {ThreadContextStoreUtil.getInstance().set("1", "3");ThreadContextStoreUtil.getInstance().set("2", "33");ThreadContextStoreUtil.getInstance().set("3", "333");System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("1"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("2"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("3"));}}, "c").start();new Thread(new Runnable() {@Overridepublic void run() {ThreadContextStoreUtil.getInstance().set("1", "4");ThreadContextStoreUtil.getInstance().set("2", "44");ThreadContextStoreUtil.getInstance().set("3", "444");System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("1"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("2"));System.out.println(Thread.currentThread().getName() + ThreadContextStoreUtil.getInstance().get("3"));}}, "d").start();} }總結
以上是生活随笔為你收集整理的ThreadLocal应用-使用ThreadLocal做线程缓存变量池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot根据环境装配配置文件
- 下一篇: RocketMQ的核心概念,一一梳理清楚