ThreadLocal的筹划与操纵[Java编程]
本文“ThreadLocal的筹划与操纵[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
早在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; }
ThreadLocal是若何做到为每一个线程保护变量的副本的呢?其实实现的思绪很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本.比方下面的示例实现:
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;
}
}
当然,这并非一个产业强度的实现,但JDK中的ThreadLocal的实现总体思绪也近似于此.
以上是“ThreadLocal的筹划与操纵[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |