请看示例:<o:p></o:p>
- public class ClassDemo {
- private String str;
- public String getStr() {
- return str;
- }
- public void setStr(String str) {
- this.str = str;
- }
- }
<o:p></o:p>
- public class FactoryDemo {
- private static final ThreadLocal<ClassDemo> threadLocal = new ThreadLocal<ClassDemo>();
- private FactoryDemo() {
- }
- public static ClassDemo getClassDemo() {
- ClassDemo classDemo = threadLocal.get();
- if (classDemo == null) {
- classDemo = new ClassDemo();
- classDemo.setStr("What can you do");
- threadLocal.set(classDemo);
- }
- return classDemo;
- }
- }
- public class Main1 {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Thread thread1=new Thread(new Runnable(){
- public void run(){
- ClassDemo obj1=FactoryDemo.getClassDemo();
- obj1.setStr("I can");
- System.out.println("This is obj1 "+obj1.getStr());
- ClassDemo obj2=FactoryDemo.getClassDemo();
- System.out.println("This is obj2 "+obj2.getStr());
- }
- });
- thread1.start();
- }
- }
This is obj1 I can
This is obj2 I can
上述的结果是在一个线程里运行,两次通过FactoryDemo.getClassDemo()得到的是同一个变量.因此运行结果是相同的.
如果分为两个线程来运行,在两个线程里同样通过FactoryDemo.getClassDemo()返回实例,但这时的实例是不同的,运行的结果也不想同.
更改后的Main1
- public class Main1 {
- public static void main(String[] args) {
- Thread thread1=new Thread(new Runnable(){
- public void run(){
- ClassDemo obj1=FactoryDemo.getClassDemo();
- obj1.setStr("I can");
- System.out.println("This is obj1 "+obj1.getStr());
- }
- });
- Thread thread2=new Thread(new Runnable(){
- public void run(){
- ClassDemo obj2=FactoryDemo.getClassDemo();
- System.out.println("This is obj2 "+obj2.getStr());
- }
- });
- thread1.start();
- thread2.start();
- }
- }
<o:p> 更改后的Main1运行结果是:</o:p>
<o:p>This is obj1 I can
This is obj2 What can you do
</o:p>
ThreadLocal类的源代码<o:p></o:p>
public class ThreadLocal
{
private Map values = Collections.synchronizedMap(new HashMap());
public Object get()
{
Thread curThread = Thread.currentThread();
Object o = values.get(curThread);
if (o == null && !values.containsKey(curThread))
{
o = initialValue();
values.put(curThread, o);
}
return o;
}
public void set(Object newValue)
{
values.put(Thread.currentThread(), newValue);
}
public Object initialValue()
{
return null;
}
}<o:p></o:p>
有关知识链接:
http://owftc.iteye.com/blog/58626
http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/lang/ThreadLocal.html
http://www.weste.net/2004/12-2/10310570584.html