ThreadLocal类的研究

在使用MyEclipse+Hibernate时,它自动产生的代码,产生一个session,使用到threadlocal类,该类主要是为多线程提供对某个变量的副本,作用类似一个线程就可以单独拥有一个变量,在一个线程里对该变量的修改操作不会影响到其他线程里的同一个变量,等于将该变量隔离了.不同于同步机制的是,需要同步的变量在某一时刻只允许一个线程对它进行修改,而且变量会保存所有线程修改之后的结果.

请看示例:<o:p></o:p>

java 代码
 
  1. public class ClassDemo {  
  2.    private String str;  
  3.   
  4.    public String getStr() {  
  5.      return str;  
  6.    }   
  7.   
  8.    public void setStr(String str) {  
  9.      this.str = str;  
  10.    }  
  11. }  

<o:p></o:p>

java 代码
  1. public class FactoryDemo {  
  2.   
  3.     private static final ThreadLocal<ClassDemo> threadLocal = new ThreadLocal<ClassDemo>();  
  4.     private FactoryDemo() {  
  5.     }  
  6.   
  7.     public static ClassDemo getClassDemo() {  
  8.         ClassDemo classDemo = threadLocal.get();  
  9.         if (classDemo == null) {  
  10.             classDemo = new ClassDemo();  
  11.             classDemo.setStr("What can you do");  
  12.             threadLocal.set(classDemo);  
  13.         }  
  14.         return classDemo;  
  15.   
  16.     }  
  17. }  
java 代码
  1. public class Main1 {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      */  
  6.     public static void main(String[] args) {  
  7.   
  8.         Thread thread1=new Thread(new Runnable(){  
  9.             public void run(){  
  10.                 ClassDemo obj1=FactoryDemo.getClassDemo();  
  11.                 obj1.setStr("I can");  
  12.                 System.out.println("This is obj1 "+obj1.getStr());  
  13.                 ClassDemo obj2=FactoryDemo.getClassDemo();  
  14.                 System.out.println("This is obj2 "+obj2.getStr());  
  15.             }  
  16.         });       
  17.           
  18.         thread1.start();      
  19.           
  20.     }  
  21.   
  22. }  
Main1运行的结果是:

This is obj1 I can
This is obj2 I can

上述的结果是在一个线程里运行,两次通过FactoryDemo.getClassDemo()得到的是同一个变量.因此运行结果是相同的.

如果分为两个线程来运行,在两个线程里同样通过FactoryDemo.getClassDemo()返回实例,但这时的实例是不同的,运行的结果也不想同.

更改后的Main1

java 代码
 
  1. public class Main1 {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Thread thread1=new Thread(new Runnable(){  
  5.             public void run(){  
  6.                 ClassDemo obj1=FactoryDemo.getClassDemo();  
  7.                 obj1.setStr("I can");  
  8.                 System.out.println("This is obj1 "+obj1.getStr());  
  9.             }  
  10.         });  
  11.         Thread thread2=new Thread(new Runnable(){  
  12.             public void run(){  
  13.                 ClassDemo obj2=FactoryDemo.getClassDemo();  
  14.                 System.out.println("This is obj2 "+obj2.getStr());  
  15.             }  
  16.         });  
  17.           
  18.         thread1.start();      
  19.         thread2.start();  
  20.           
  21.     }  
  22.   
  23. }  

<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
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值