`
shaoxiongwang#21cn.com
  • 浏览: 76583 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ThreadLocal类的研究

    博客分类:
  • JAVA
阅读更多
在使用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
分享到:
评论

相关推荐

    入研究java.lang.ThreadLocal类.docx

    ### 知识点详解:Java.lang.ThreadLocal 类 #### 一、概述 **ThreadLocal** 并非线程的一种特殊实现形式,而是一种为每个线程提供独立副本的机制,通常被称为“线程局部变量”。这种机制使得每个线程都可以独立...

    java.lang研究

    在Java 2中,一些新类和方法被添加到`java.lang`包,如`ThreadLocal`、`RuntimePermission`等,以增强安全性、多线程支持和性能优化。 值得注意的是,虽然`java.lang`包中的许多类在早期版本的Java中就已经存在,但...

    基于全局储存的新思路 _ Tomcat的一种通用回显方法研究1

    为解决这一问题,文章引述了@kingkk师傅的研究,即通过反射修改Tomcat内部的控制变量,使请求处理过程中将Request和Response存储在ThreadLocal中,从而在反序列化时获取Response。 然而,这种方法受到Tomcat请求...

    程序员面试中的多线程问题

    ThreadLocal类的用途与使用 `ThreadLocal`类提供了线程级别的局部变量。它为每个使用该变量的线程提供了独立的变量副本,使得每个线程修改副本时不会影响到其他线程的副本。这对于解决线程安全问题特别有用,尤其...

    struts2源码研究

    - 初始化`FileManager`,用于管理类路径下的文件和资源配置。 - 加载默认配置文件`default.properties`和其他基础的`struts.xml`配置文件。 - 加载`LegacyStrutsProperties`,处理Struts1与Struts2的兼容性问题。...

    基于Hibernate的数据持久层关键技术的研究

    ### 基于Hibernate的数据持久层关键技术的研究 #### 一、引言 随着软件开发的不断进步和技术的发展,越来越多的企业级应用需要高效地管理和访问大量数据。为了更好地满足这一需求,许多开发团队选择了使用ORM...

    Java核心API需要掌握的程度

    - **并发编程**:深入研究`Thread`类及其相关接口,如`Runnable`、`Callable`等,理解同步机制和锁的概念。 - **异常处理**:学习如何正确地使用异常处理机制,了解自定义异常的创建方法。 总之,Java核心API的学习...

    深入研究Servlet线程安全性问题

    5. **使用并发工具类**:Java的并发包(java.util.concurrent)提供了如`Atomic`类、`ConcurrentHashMap`等线程安全的数据结构和工具,可以更高效地处理并发问题。 总之,理解Servlet的多线程机制以及Java内存模型...

    JAVA核心技术第八版源代码

    7. **多线程**:线程的创建方式,同步机制(synchronized关键字,wait()、notify()、notifyAll()),线程池,ThreadLocal。 8. **网络编程**:Socket编程,ServerSocket,TCP和UDP协议。 9. **反射**:类的动态...

    Java系统中内存泄漏测试方法的研究

    这篇研究主要探讨了如何检测和分析Java应用中的内存泄漏问题。以下是对这个主题的详细阐述: 一、内存泄漏的理解 内存泄漏是指程序在申请内存后,无法释放已经不再使用的内存空间,一次小的内存泄漏可能不明显,但...

    java线程入门教程,涉及线程基本知识,显浅易懂..zip

    Java线程是多任务编程的基础,它允许程序同时执行多个独立的执行流,这使得Java在并发处理上具有强大的能力。本教程将带你逐步了解Java线程的基本...在实践中,还需要结合具体场景进行深入研究和优化,以实现高效并发。

    concurrent-1.3.4-sources.jar

    1. **ThreadLocal**: 这个类为每个线程提供了一个独立的变量副本,使得每个线程都可以独立地改变自己的副本,而不会影响其他线程。在多线程环境下,ThreadLocal可以有效避免数据竞争,提高程序的并发性。 2. **java...

    Himo Zhu-京东IAST研究及实践.pdf

    1. **污点传播技术**:通过在请求中添加污点标记(如魔数),利用Tomcat线程机制和ThreadLocal,确保污点路径的唯一性,以追踪敏感数据在整个应用程序中的流动情况。 2. **栈签名算法**:在运行时,将栈信息转换为...

    java 内存泄露

    但在某些情况下,如使用了WeakReference、SoftReference等弱引用,或者有线程局部变量(ThreadLocal)未正确清理,就可能导致类加载器无法被回收,从而引发内存泄露。 三、内存泄露的诊断方法 1. **使用工具辅助...

    Java并发编程实践-电子书-05章.pdf

    - **分析原因**:深入研究冲突发生的原因,如不恰当的锁使用、不充分的同步等。 - **修复方案**:根据分析结果,选择合适的同步机制或其他策略来解决冲突。 总之,通过理解和应用以上提到的各种技术手段,开发者...

    2021 Java面试题.rar

    Java是一种广泛使用的面向对象的编程语言,其设计目标是具有高度的可移植性、健壮性和安全性...所以,仔细研究"2021面试题-20220207.pdf"中的题目,结合上述知识点进行深入学习,是每位Java开发者在面试前必备的功课。

    Source:Java原始注释

    Java提供了丰富的并发工具,如`synchronized`关键字、`volatile`变量、`ThreadLocal`、`Atomic`类等。通过查看并发源码,可以深入理解这些机制的底层实现,例如锁的升级、内存模型以及线程间的通信。 4. **线程本地...

    java_concurrency_in_practice_source源代码

    8. **线程局部变量**:`ThreadLocal`类允许每个线程拥有独立的变量副本,避免了线程间的数据冲突。源码中可能会包含`ThreadLocal`的使用,以实现线程间的隔离。 9. **中断和异常处理**:Java允许线程中断,通过`...

Global site tag (gtag.js) - Google Analytics