java并发编程--ThreadLocal的用法和分析 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

猜你喜欢

转载自ly-ltw.iteye.com/blog/2239567