`
bcyy
  • 浏览: 1885198 次
文章分类
社区版块
存档分类
最新评论

Java多线程之ThreadLocal

 
阅读更多

下面是ThreadLocal的测试代码,更多信息请参考注释

  1. packagecom.jadyer.thread.local;
  2. importjava.util.Random;
  3. /**
  4. *ThreadLocalTest
  5. *@see=============================================================================================================
  6. *@seeThreadLocal的作用和目的
  7. *@seeThreadLocal用于实现线程内的数据共享。即对于相同的代码,多个模块在不同的线程中运行时,分别共享不同的数据
  8. *@see每个线程调用全局的ThreadLocal.set()方法,就相当于在其内部的Map中增加一条记录,key是各自的线程,value是各自set()传进去的值
  9. *@see=============================================================================================================
  10. *@seeThreadLocal的应用场景
  11. *@see例如Struts2中的ActionContext,同一段代码被不同的线程调用运行时,该代码操作的数据是每个线程各自的状态和数据
  12. *@see对于不同的线程来说,ActionContext.getContext()方法得到的对象都不相同
  13. *@see对于同一个线程来说,ActionContext.getContext()方法无论在哪个模块中或者是被调用多少次,其得到的都是同一个对象
  14. *@see通过查看com.opensymphony.xwork2.ActionContex的第43和166行源码,不难发现,Struts2就是这么做的
  15. *@see=============================================================================================================
  16. *@see线程中的成员变量和局部变量
  17. *@see成员变量:多个线程操作同一个对象的成员变量时,它们对成员变量的改变是彼此影响的
  18. *@see局部变量:每个线程都会有一个该局部变量的拷贝,一个线程对局部变量的改变不会影响到其它线程对该局部变量的操作
  19. *@see=============================================================================================================
  20. *@author宏宇
  21. *@createFeb27,201212:10:24AM
  22. */
  23. publicclassThreadLocalTest{
  24. publicstaticvoidmain(String[]args){
  25. newThread(newMyThread(newRandom().nextInt())).start();
  26. newThread(newMyThread(newRandom().nextInt())).start();
  27. }
  28. }
  29. classMyThreadimplementsRunnable{
  30. privateIntegerdata;
  31. publicMyThread(Integerdata){
  32. this.data=data;
  33. }
  34. @Override
  35. publicvoidrun(){
  36. System.out.println(Thread.currentThread().getName()+"hasputdata:"+data);
  37. User.getThreadInstance().setName("name"+data);
  38. User.getThreadInstance().setAge(data);
  39. newPig().getMyData();
  40. newDog().getMyData();
  41. }
  42. }
  43. classPig{
  44. publicvoidgetMyData(){
  45. Useruser=User.getThreadInstance();
  46. System.out.println("Pigfrom"+Thread.currentThread().getName()+"getMyData:"+user.getName()+"|"+user.getAge());
  47. }
  48. }
  49. classDog{
  50. publicvoidgetMyData(){
  51. Useruser=User.getThreadInstance();
  52. System.out.println("Dogfrom"+Thread.currentThread().getName()+"getMyData:"+user.getName()+"|"+user.getAge());
  53. }
  54. }
  55. /**
  56. *自定义的线程范围内共享的对象。即该类会针对不同的线程分别创建一个独立的对象
  57. *@see此时每个线程得到的将是自己的实例,各线程间得到的实例没有任何关联
  58. *@see我们可以拿它,与单例模式中的懒汉式,进行对比,这是个很有意思的东西
  59. *@seeStruts2就是这么设计的,它的每一个请求就是一个线程
  60. */
  61. classUser{
  62. privatestaticThreadLocal<User>instanceMap=newThreadLocal<User>();
  63. privateUser(){}
  64. /**
  65. *得到与当前线程相关的,当前类的实例
  66. */
  67. publicstatic/*synchronized*/UsergetThreadInstance(){
  68. Userinstance=instanceMap.get();
  69. if(null==instance){
  70. instance=newUser();
  71. instanceMap.set(instance);
  72. }
  73. returninstance;
  74. }
  75. privateStringname;
  76. privateintage;
  77. publicStringgetName(){
  78. returnname;
  79. }
  80. publicvoidsetName(Stringname){
  81. this.name=name;
  82. }
  83. publicintgetAge(){
  84. returnage;
  85. }
  86. publicvoidsetAge(intage){
  87. this.age=age;
  88. }
  89. }
分享到:
评论

相关推荐

    java ThreadLocal多线程专属的变量源码

    java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...

    Java多线程 之 临界区、ThreadLocal.docx

    Java多线程编程中,临界区和ThreadLocal是两种重要的并发控制机制,它们用于解决多线程环境下的数据安全问题。 1. **临界区(Critical Section)** 临界区是指一段代码,它在同一时刻只允许一个线程进行访问。在...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    java多线程设计

    本知识点将深入探讨Java多线程设计以及如何利用“不可变对象”(immutable objects)来避免多线程环境中的非安全问题。 一、Java多线程基础 1. 线程的创建:Java提供了两种创建线程的方式——继承Thread类和实现...

    java事务 - threadlocal

    总结一下,Java事务和ThreadLocal都是Java多线程编程中不可或缺的工具。事务用于保证数据库操作的原子性和一致性,ThreadLocal则为每个线程提供了独立的数据空间,避免了线程间的数据冲突。理解并熟练运用这两个概念...

    【JAVA多线程】多线程编程核心技术学习资料

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程技术尤其关键,因为它们能够充分利用多核处理器的能力。这份"Java多线程编程...

    JAVA 多线程的PPT和示例

    Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。这份"JAVA多线程的PPT和示例...

    Java多线程的总结

    Java多线程是Java编程中的一个核心概念,它在现代软件开发中扮演着至关重要的角色。多线程允许程序同时执行多个任务,提高了系统资源的利用率,提升了应用程序的响应速度和并发性能。对于大型分布式系统、Web应用...

    简单分析Java线程编程中ThreadLocal类的使用共

    Java线程编程中的ThreadLocal类是一个非常重要的工具,它在多线程环境下提供了一种线程局部变量的机制。ThreadLocal并非是简单的变量,而是一种能够确保每个线程都拥有独立副本的变量容器。理解ThreadLocal的工作...

    java多线程编程实例_Source

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在本实例源码中,包含17个章节和上百个实例,旨在深入讲解Java多线程的核心概念和实际应用。 一、线程基础知识 在Java中,...

    java多线程_java多线程下变量共享_

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提升系统效率。在多线程环境中,变量共享是一个常见的需求,但也是引发问题的关键点。本篇文章将深入探讨Java多线程下变量共享的问题以及解决...

    JAVA多线程的一个带UI界面的例子

    在Java编程中,多线程是一项关键特性,...总之,这个"JAVA多线程的一个带UI界面的例子"涵盖了Java多线程编程和GUI设计的核心概念,通过实际的代码示例,有助于开发者深入理解如何在实际应用中正确、高效地使用多线程。

    java 简单的ThreadLocal示例

    Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...

    java多线程

    由于提供的文件内容大部分与Java多线程编程核心技术并无直接关联,而是关于电子书资源的联系方式和说明,因此不能直接从这部分内容中生成关于Java多线程的知识点。但考虑到描述中提到了电子书的标题以及它涉及的主题...

    Java多线程实例代码

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类和实现`Runnable`接口。 1. 继承Thread类: 当你需要创建一...

    基于Java多线程同步的安全性研究.pdf

    接着,文章讨论了Java多线程同步机制中可能出现的安全性问题,如可见性、有序性和互斥性问题,并提出了解决这些问题的方法,包括使用ThreadLocal和Lock对象。 在文章的后半部分,讨论了Java多线程执行过程的机制和...

    java多线程面试题和答案

    以下是一些关于Java多线程的面试题及其答案,涵盖了基础概念、并发控制、线程安全以及性能优化等方面。 1. **什么是Java多线程?** 多线程是指在单个程序中同时执行多个线程,这样可以提高应用程序的效率和响应...

    Java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...

    java多线程面试题59题集合

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提升系统效率。在面试中,对Java多线程的理解和熟练运用往往成为衡量开发者技能水平的重要标准。以下是对Java多线程面试题59题集合中可能涉及的...

Global site tag (gtag.js) - Google Analytics