博客年龄:17年6个月
访问:?
文章:291篇

个人描述

姓名:丹臣 职业:DBA 公司:TAOBAO Mail:zhaolinjnu(at)163.com MSN:echo_lin@hotmail.com 微博http://twitter.com/zhaolinjnu

java中的threadlocal变量测试

分类:Java | 标签: threadlocal  
2013-07-23 11:15 阅读(?)评论(0)
在java中,可以声明一个变量为ThreadLocal型,声明这样的变量,因为不用重复的new,因此可以提升性能,下面是测试示例:
package com.taobao.danchen.threadlocal;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class PerformanceTest {
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

/**
* @param args
*/
public static void main(String[] args) {
int loop=100000;
Date date=new Date();
long start=System.currentTimeMillis();
for(int i=0;i<loop;i++){
DateUtil.format(date);
}
long end=System.currentTimeMillis();
System.out.println("ThreadLocal:"+(end-start)+"ms");
start=System.currentTimeMillis();
for(int i=0;i<loop;i++){
DateFormat df=new SimpleDateFormat(DATE_FORMAT);
df.format(date);
}
end=System.currentTimeMillis();
System.out.println("Normal:"+(end-start)+"ms");
}

}

测试结果:
ThreadLocal:269ms
Normal:764ms

package com.taobao.danchen.threadlocal;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * ThreadLocal的用法
 * @author danchen
 *
 */

public class DateUtil {
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static ThreadLocal<DateFormat> threadLocalDateFormat = new ThreadLocal<DateFormat>(){
protected synchronized DateFormat initialValue() {  
return new SimpleDateFormat(DATE_FORMAT);
}
};
public static DateFormat getDateFormat() {  
return threadLocalDateFormat.get();
}
public static Date parse(String textDate) throws ParseException{
return getDateFormat().parse(textDate);
}
public static String format(Date date){
return getDateFormat().format(date);
}
}

这里还有另外一种写法:
/**
 * 第二种写法
 * @author danchen
 *
 */
public class DateUtil2 {
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static ThreadLocal<DateFormat> threadLocalDateFormat = new ThreadLocal<DateFormat>();
public static DateFormat getDateFormat() {
if(threadLocalDateFormat.get()==null){
DateFormat df=new SimpleDateFormat(DATE_FORMAT);
threadLocalDateFormat.set(df);
return df;
}
return threadLocalDateFormat.get();
}
public static Date parse(String textDate) throws ParseException{
return getDateFormat().parse(textDate);
}
public static String format(Date date){
return getDateFormat().format(date);
}
}


关于什么是threadlocal,可以参见oracle文档:
http://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html
 
表  情:
加载中...
 

请各位遵纪守法并注意语言文明