您的位置:首页 >> 编程开发 >> Java >> JDK核心API >> 正文
JDK核心API RSS
 

多线程简明教程--使用ThreadLocal的设计与使用

http://www.rdxx.com 05年07月24日 21:14 JR 我要投稿

关键词: 简明教程 , 多线程 , thread , 设计 , CA , 教程 , read , 线程

引言


在上面几篇中我们已经分析了Java中对多线程进行同步的几种机制,包括语言级别的synchronized关键字支持、Mutex/Simaphore等高层的同步包的设计和使用。但是,其实早在Java 1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序时提供了一种新的选择。使用这个工具类可以很简洁地编写出优美的多线程程序,虽然ThreadLocal非常有用,但是似乎现在了解它、使用它的朋友还不多。

ThreadLocal是什么


    ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明,在其它的一些语言编译器实现(如IBM XL FORTRAN)中,它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持,而是提供了一个ThreadLocal的类来提供支持,所以,在Java中编写线程局部变量的代码相对比较笨拙,这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。

ThreadLocal的设计


首先看看ThreadLocal的接口:

  1. Object get() ; // 返回当前线程的线程局部变量副本 
  2. protected  Object initialValue(); // 返回该线程局部变量的当前线程的初始值
  3. void set(Object value); // 设置当前线程的线程局部变量副本的值


ThreadLocal有3个方法,其中值得注意的是initialValue(),该方法是一个protected的方法,显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值,这个方法是一个延迟调用方法,在一个线程第1次调用get()或者set(Object)时才执行,并且仅执行1次。ThreadLocal中的确实实现直接返回一个null:

  1.     protected Object initialValue() {
  2.         return null;
  3.     }


    ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。比如下面的示例实现:

  1. public class ThreadLocal { 
  2.   private Map values = Collections.synchronizedMap(new HashMap());
  3.   public Object get() {
  4.     Thread curThread = Thread.currentThread();
  5.     Object o = values.get(curThread);
  6.     if (o == null && !values.containsKey(curThread)) {
  7.       o = initialValue();
  8.       values.put(curThread, o);
  9.     }
  10.     return o;
  11.   }
  12.   public void set(Object newValue) {
  13.     values.put(Thread.currentThread(), newValue);
  14.   }
  15.   public Object initialValue() {
  16.     return null;
  17.   }
  18. }

共3页  第1页 第2页 第3页

 
 
标签: 简明教程 , 多线程 , thread , 设计 , CA , 教程 , read , 线程 打印本文
 
 
  相关资讯
RSS
 
无相关新闻
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站