为了凑字,把oracle文档里介绍ThreadLocal抄过来
public class ThreadLocal<T>
extends Object
For example, the class below generates unique identifiers local to each thread. A thread's id is assigned the first time it invokes ThreadId.get() and remains unchanged on subsequent calls.
import java.util.concurrent.atomic.AtomicInteger; public class ThreadId { // Atomic integer containing the next thread ID to be assigned private static final AtomicInteger nextId = new AtomicInteger(0); // Thread local variable containing each thread's ID private static final ThreadLocal<Integer> threadId = new ThreadLocal<Integer>() { @Override protected Integer initialValue() { return nextId.getAndIncrement(); } }; // Returns the current thread's unique ID, assigning it if necessary public static int get() { return threadId.get(); } }
Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the ThreadLocal instance is accessible; after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).
接下来一个示例
import java.util.Random; public class ThreadLocalTest { public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable(){ public void run() { int age = new Random().nextInt(); MyData md = MyData.getInstance(); md.setAge(age); md.setName(Thread.currentThread().getName()); System.out.println(Thread.currentThread().getName()+ " age is "+age); new A().get(); new B().get(); }; }).start(); } } static class A{ public void get(){ MyData md = MyData.getInstance(); System.out.println(Thread.currentThread().getName()+" A age "+md.getAge() + " name = "+md.getName()); } } static class B{ public void get(){ MyData md = MyData.getInstance(); System.out.println(Thread.currentThread().getName()+" B age "+md.getAge() + " name = "+md.getName()); } } } class MyData{ private MyData(){ } public static MyData md = null; private static ThreadLocal<MyData> tl = new ThreadLocal<MyData>(); public synchronized static MyData getInstance(){ md = tl.get(); if(null==md){ md = new MyData(); tl.set(md); } return md; } 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; } }
想了半天不知如何表达,语文太差。
推荐博客
http://www.cnblogs.com/dolphin0520/p/3920407.html