这里行使 ThreadLocal 从头实现该成果如下所示。
- public class SessionHandler {
- public static ThreadLocal<Session> session = new ThreadLocal<Session>();
- @Data
- public static class Session {
- private String id;
- private String user;
- private String status;
- }
- public void createSession() {
- session.set(new Session());
- }
- public String getUser() {
- return session.get().getUser();
- }
- public String getStatus() {
- return session.get().getStatus();
- }
- public void setStatus(String status) {
- session.get().setStatus(status);
- }
- public static void main(String[] args) {
- new Thread(() -> {
- SessionHandler handler = new SessionHandler();
- handler.getStatus();
- handler.getUser();
- handler.setStatus("close");
- handler.getStatus();
- }).start();
- }
- }
行使 ThreadLocal 改革后的代码,不再必要在各个要领间转达 Session 工具,而且也很是轻松的担保了每个线程拥有本身独立的实例。
假如单看个中某一点,更换要领许多。好比可通过在线程内建设局部变量可实现每个线程有本身的实例,行使静态变量可实现变量在要领间的共享。但假如要同时满意变量在线程间的断绝与要领间的共享,ThreadLocal再吻合不外。
七、总结
- ThreadLocal 并不办理线程间共享数据的题目
- ThreadLocal 通过隐式的在差异线程内建设独立实例副本停止了实例线程安详的题目
- 每个线程持有一个 Map 并维护了 ThreadLocal 工具与详细实例的映射,该 Map 因为只被持有它的线程会见,故不存在线程安详以及锁的题目
- ThreadLocalMap 的 Entry 对 ThreadLocal 的引用为弱引用,停止了 ThreadLocal 工具无法被接纳的题目
- ThreadLocalMap 的 set 要领通过挪用 replaceStaleEntry 要领接纳键为 null 的 Entry 工具的值(即为详细实例)以及 Entry 工具自己从而防备内存走漏
- ThreadLocal 合用于变量在线程中断绝且在要领间共享的场景
【本文为51CTO专栏作者“郭俊”的原创稿件,转载请接洽原作者】
戳这里,看该作者更多好文
【编辑保举】
- 全栈必备 你必要相识的Java编程基本
- 深入领略多线程(二)—— Java的工具模子
- 外媒速递:下一代Java新特征瞻望——Java JDK 10
- 作为你的第一门说话,初学Java时是什么感觉?
- JavaScript写库前的筹备事变
【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|