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

java并发编程--ThreadLocal的用法和分析

阅读更多

ThreadLocal这个类,理解起来比较简单,但是使用时,还是需要一些技巧的,简单介绍如下:

 

例子1:threadLocal变量一般用法

 

Java代码  收藏代码
  1. package concurrent.thread;  
  2.   
  3. /** 
  4.  * 技巧: 
  5.  *      1.在当前线程里执行threadLocal.set(value) 相当于 currentThread.threadLocalMap.set(threadLocal,value)。 
  6.  *          即:每个线程均含有一个threadLocalMap变量,该变量由ThreadLocal维护。 
  7.  *      2.ThreadLocal变量一般使用private static修饰。 
  8.  */  
  9. public class ThreadLocalDemo_step0 {  
  10.   
  11.     private static ThreadLocal<String> myData = new ThreadLocal<String>();  
  12.   
  13.     public static void main(String[] args) {  
  14.         Thread t1 = new Thread(new Runnable(){  
  15.             public void run() {  
  16.                 System.out.println("Thread " + Thread.currentThread().getName() + "[begin] has " + myData.get());  
  17.                 myData.set("t1");  
  18.                 System.out.println("Thread " + Thread.currentThread().getName() + "[end] has " + myData.get());  
  19.             }  
  20.         });  
  21.         Thread t2 = new Thread(new Runnable(){  
  22.             public void run() {  
  23.                 System.out.println("Thread " + Thread.currentThread().getName() + "[begin] has " + myData.get());  
  24.                 myData.set("t2");  
  25.                 System.out.println("Thread " + Thread.currentThread().getName() + "[end] has " + myData.get());  
  26.             }  
  27.         });  
  28.         t1.start();  
  29.         t2.start();  
  30.     }  
  31. }  
 

 

例子2:threadLocal变量的简单封装用法(重要)

 

Java代码  收藏代码
  1. package concurrent.thread;  
  2.   
  3. /** 
  4.  * 技巧: 
  5.  *      3.如果希望线程局部变量初始化其它值,那么需要自己实现ThreadLocal的子类并重写initialValue()方法, 
  6.  *      通常使用一个内部匿名类对ThreadLocal进行子类化.比如下面的例子,SerialNum类为每一个类分配一个序号: 
  7.  */  
  8. public class ThreadLocalDemo_step1 {  
  9.   
  10.     public static void main(String[] args) {  
  11.         Thread t1 = new Thread(new Runnable(){  
  12.             public void run() {  
  13.                 System.out.println("Thread " + Thread.currentThread().getName() + " has " + SerialNum.get());  
  14.             }  
  15.         });  
  16.         Thread t2 = new Thread(new Runnable(){  
  17.             public void run() {  
  18.                 System.out.println("Thread " + Thread.currentThread().getName() + " has " + SerialNum.get());  
  19.             }  
  20.         });  
  21.         t1.start();  
  22.         t2.start();  
  23.     }  
  24.       
  25.     //技巧:对threadLocal变量进行简单封装,可以简化多线程操作  
  26.     static class SerialNum {     
  27.          // The next serial number to be assigned     
  28.          private static int nextSerialNum = 0;     
  29.           
  30.          private static ThreadLocal serialNum = new ThreadLocal() {     
  31.              protected synchronized Object initialValue() {     
  32.                  return new Integer(nextSerialNum++);     
  33.              }     
  34.          };     
  35.           
  36.          public static int get() {     
  37.              return ((Integer) (serialNum.get())).intValue();     
  38.          }     
  39.      }     
  40.   
  41.       
  42. }  
 

 

 

参考文献:

 

http://my.oschina.net/ITBoy/blog/17190java类ThreadLocal的理解

http://www.iteye.com/topic/103804正确理解ThreadLocal

分享到:
评论

相关推荐

    Java并发编程实战

    5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6 构建高效且可伸缩的结果缓存 第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1...

    Java 并发编程实战

    5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6 构建高效且可伸缩的结果缓存 第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1...

    汪文君高并发编程实战视频资源下载.txt

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    Java并发编程实战(中文版).pdf java多线开发

    死锁是指两个或两个以上的进程在执行过程中,因争夺...避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置 标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    汪文君高并发编程实战视频资源全集

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    Java多线程编程中ThreadLocal类的用法及深入

    早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了,它是为了解决多线程并发问题而设计的,只不过设计得有些难用,所以至今没有得到广泛使用。其实它还是挺有用的,不相信的话,我们一起来看看这个例子吧。 一个...

    Java高级程序设计-多线程(二).pptx

    本章内容 掌握同步代码块的使用 掌握同步方法的使用 理解线程死锁 掌握 ThreadLocal 类的使用 使用多线程模拟猴子采花 使用同步方法模拟购票 使用多线程模拟购物订单生成 使用 ThreadLocal 类模拟银行取款 Java高级...

    JAVA面试常见问题整理

    接下来,文章重点讲解了ConcurrentHashMap的原理和实现方式,以及ThreadLocal的原理和使用场景。 最后,文章简要概述了Spring框架的基本概念和作用,包括IOC、AOP、Bean的作用域等内容。同时,还涉及了事务处理的...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    所使用的应用服务器是jboss 5.1和weblogic 11g,详细介绍了这两种应用服务器的安装和使用,以及如何在两大主流服务器上安装、部署java ee应用。  本书内容主要包括三部分,第一部分介绍java ee开发的基础知识,...

    java随机数

    1.java.lang.Math.random() 在所有其他语言中,生成随机数就像是使用Math工具类,如abs, pow, floor, sqrt和其他数学函数。大多数人通过书籍、教程和课程来了解这个类。一个简单的例子:从0.0到1.0之间可以生成一个...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】Java 中的final关键字有哪些用法? 31 【基础】内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制? 31 【基础】I/O总结 31 【基础】Java中如何实现序列化,有什么意义? 34 【WEB】session与...

    java核心知识点整理.pdf

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

    JAVA核心知识点整理(有效)

    可达性分析............................................................................................................................................... 26 2.3.2. 2.3.3. 老年代 ........................

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Spring3.x企业应用开发实战(完整版) part1

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

Global site tag (gtag.js) - Google Analytics