package org.vic.demo.ThreadLocal.threadLocal; import java.util.HashMap; import java.util.Map; public class MyThreadLocal { private static Map<Thread, Object> threadLocalPool = new HashMap<>(); /** * get duplicate object. */ public<T> T get() { Thread currentThread = Thread.currentThread(); @SuppressWarnings("unchecked") T t = threadLocalPool.get(currentThread) == null ? null : (T) threadLocalPool.get(currentThread); return t; } /** * set object to duplicate */ public <T>void set(T t) { Thread currentThread = Thread.currentThread(); threadLocalPool.put(currentThread, t); } /** * remove thread and duplication from the pool */ public void remove() { Thread thread = Thread.currentThread(); threadLocalPool.remove(thread); System.out.println("thread " + thread.getName() + " has been removed!"); } }
package org.vic.demo.ThreadLocal.test; import java.util.Random; import org.vic.demo.ThreadLocal.threadLocal.MyThreadLocal; public class Test implements Runnable { private static MyThreadLocal threadLocal = new MyThreadLocal(); public void doTest () { String currentThreadName = Thread.currentThread().getName(); System.out.println("current thread name is " + currentThreadName); Random ran = new Random(); int age = ran.nextInt(20); System.out.println(currentThreadName + " got age : " + age); Student stu = this.getStudenByThreadLocal(); stu.setName(currentThreadName); stu.setAge(age); System.out.println("thread name (student name) is " + stu.getName() + " and age is " + stu.getAge()); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("thread name (student name) is " + stu.getName() + " and age is " + stu.getAge()); threadLocal.remove(); } public Student getStudenByThreadLocal () { Student stu = (Student) threadLocal.get(); if (stu == null) { stu = new Student(); threadLocal.set(stu); } return stu; } @Override public void run() { doTest(); } public static void main(String[] args) { Test t = new Test(); Thread thr1 = new Thread(t, "thr1"); Thread thr2 = new Thread(t, "thr2"); thr1.start(); thr2.start(); } } class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
相关推荐
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
ThreadLocal原理及在多层架构中的应用
java 简单的ThreadLocal示例
ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。
关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. ...
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
ThreadLocal
说明ThreadLocal功能的一个测试工程,eclipse项目
设计模式及ThreadLocal详细讲解资料,想要学习java或者提升自己技术的同学可以下载观看
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
正确理解ThreadLocal.pdf
DbUTils中用ThreadLocal类
ThreadLocalMap是ThreadLocal类中的内部类,实例却被Thread类持有,相当于每个线程持有一个map
主要介绍ThreadLocal的原理,实例分析以及注意事项
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
Synchronized与ThreadLocal
本例以序列号生成的程序为例,展示ThreadLocal的使用
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量