早在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的接口:
object get() ; // 返回当前线程的线程局部变量副本 protected object initialvalue(); // 返回该线程局部变量的当前线程的初始值
void set(object value); // 设置当前线程的线程局部变量副本的值
threadlocal有3个方法,其中值得注意的是initialvalue(),该方法是一个protected的方法,显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值,这个方法是一个延迟调用方法,在一个线程第1次调用get()或者set(object)时才执行,并且仅执行1次。threadlocal中的确实实现直接返回一个null:
| protected object initialvalue() { return null; } |
| 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; } } |
| public class serialnum { // the next serial number to be assigned private static int nextserialnum = 0; private static threadlocal serialnum = new threadlocal() { protected synchronized object initialvalue() { return new integer(nextserialnum++); } }; public static int get() { return ((integer) (serialnum.get())).intvalue(); } } |
| int serial = serialnum.get(); |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器