ThreadLocal类之简单应用示例

栏目: Java · 发布时间: 9年前

内容简介:ThreadLocal类之简单应用示例

在日常开发的系统中,日期处理是非常非常用的一个功能,处理的日期的时候就需要用到SimpleDateFormat对象,但是我们都知道SimpleDateFormat本身不是线程安全的(如果不知道的请看源码),所以就需要频繁创建SimpleDateFormat这个对象。但是我们知道创建这个对象本身不仅是很费时的,而且创建的这些对象存活期很短,导致内存中大量这样的对象需要被GC,所以我们自然而然的想到使用ThreadLocal来给每个线程缓存一个SimpleDateFormat实例,提高性能。下面是一个具体的实现的小例子,其实不仅针对SimpleDateFormat对象,对于数据库连接等等都可以这么使用。

package cn.bridgeli.demo;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

public class DateFormatFactory {

    private static final Map<DatePatternEnum, ThreadLocal<DateFormat>> pattern2ThreadLocal;

    static {
        DatePatternEnum[] patterns = DatePatternEnum.values();
        int len = patterns.length;
        pattern2ThreadLocal = new HashMap<DatePatternEnum, ThreadLocal<DateFormat>>(len);

        for (int i = 0; i < len; i++) {
            DatePatternEnum datePatternEnum = patterns[i];
            final String pattern = datePatternEnum.pattern;

            pattern2ThreadLocal.put(datePatternEnum, new ThreadLocal<DateFormat>() {
                @Override
                protected DateFormat initialValue() {
                    return new SimpleDateFormat(pattern);
                }
            });
        }
    }

    // 获取DateFormat
    public static DateFormat getDateFormat(DatePatternEnum patternEnum) {
        ThreadLocal<DateFormat> threadDateFormat = pattern2ThreadLocal.get(patternEnum);
        // 不需要判断threadDateFormat是否为空
        return threadDateFormat.get();
    }
}

对应的时间枚举类(如果还有其他格式的时间需要处理,可以直接在这个类里面添加即可):

package cn.bridgeli.demo;

public enum DatePatternEnum {

    TimePattern("yyyy-MM-dd HH:mm:ss"),
    DatePattern("yyyy-MM-dd");

    public String pattern;

    private DatePatternEnum(String pattern) {
        this.pattern = pattern;
    }
}

这样我们就可以每次调用DateFormatFactory.getDateFormat获取到对应的时间格式化类了。之前我们提到使用ThreadLocal同时可以避免参数传递。假如某个类的某个方法要调用到其他类的方法,而且方法内需要使用时间格式化类。按照正常情况下我们把该时间格式化类作为参数进行传递,但如果有了ThreadLocal这个类,我们可以不需要作为参数传递了,直接在方法类通过ThreadLocal得到时间格式化类。

参考资料:

1. https://segmentfault.com/a/1190000000537475

作 者: Bridge Li,http://www.bridgeli.cn

原文链接: http://www.bridgeli.cn/archives/367

版权声明:本站作品如非特殊声明均为原创,转载时请注明作者和原文链接,谢谢。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learning PHP, MySQL, and JavaScript

Learning PHP, MySQL, and JavaScript

Robin Nixon / O'Reilly Media / 2009-7-21 / USD 39.99

Learn how to create responsive, data-driven websites with PHP, MySQL, and JavaScript - whether or not you know how to program. This simple, streamlined guide explains how the powerful combination of P......一起来看看 《Learning PHP, MySQL, and JavaScript》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具