1.commons-lang DateFormatUtils 为ä»ä¹çº¿ç¨å®å
¨
2.ThreadLocal与SimpleDateFormat
commons-lang DateFormatUtils 为ä»ä¹çº¿ç¨å®å ¨
æ们é½ç¥éjdkéé¢çSimpleDateFormatä¸æ¯çº¿ç¨å®å ¨çï¼ècommons-langä¸çDateFormatUtilsï¼æè 说FastDateFormat)å´æ¯ï¼é常快éæäºä¸ç¼ï¼åç°éé¢ä¹å¼ç¨äºSimpleDateFormat,源码é£ä¸ºä»ä¹å®ä¼çº¿ç¨å®å ¨ï¼OK,ä»ç»åæä¸ä¸ï¼
1,å设æ们è°ç¨å¦ä¸æ¹æ³
public static String format(Date date, String pattern) {
return format(date, pattern, null, null);
}
é´æ¥è°ç¨
public static String format(Date date, String pattern, TimeZone timeZone, Locale locale) {
FastDateFormat df = FastDateFormat.getInstance(pattern, timeZone, locale);
return df.format(date);
}
å±é¨åéï¼ææ¶æ²¡ä»ä¹é®é¢ï¼
2,è¿å ¥FastDateFormat
public static synchronized FastDateFormat getInstance(String pattern, TimeZone timeZone, Locale locale) {
FastDateFormat emptyFormat = new FastDateFormat(pattern, timeZone, locale);
FastDateFormat format = (FastDateFormat) cInstanceCache.get(emptyFormat);
if (format == null) {
format = emptyFormat;
format.init(); // convert shell format into usable one
cInstanceCache.put(format, format); // this is OK!
}
return format;
}
ãã
é¦å ï¼è¿æ¯ä¸ªåæ¥æ¹æ³ï¼
å ¶æ¬¡ï¼å¨æé æ¹æ³ä¸ï¼åªæ¯å¯¹4个Finalåéèµå¼ï¼
ç¶åï¼å¦ææ¾ä¸å°ï¼åè°ç¨ç¸åºçinitæ¹æ³ï¼è¿ä¸ªæ¹æ³éé¢ä¹åªæ¯ä½¿ç¨Finalåéæ¥å¯¹å¦å¤ç两个transientåéèµå¼ï¼
åç¶åæ¾å°mapä¸åç¼åï¼æé«é度ï¼
ç»è¿ä¸é¢çæä½ï¼ä¿è¯äºåªè¦ä¼ éçåæ°ç¸å(pattern,timeZone,locale)ï¼è·å¾çå°±æ¯åä¸ä¸ªå®ä¾ï¼ä½æ¯è¿ä¸ªå®ä¾ææ¥æçå ±äº«åéæ¯finalçï¼æ²¡æå ¶ä»çæºä¼ä¿®æ¹äºï¼åªè¯»çshareä¹æ²¡å ³ç³»äºï¼
3,å¼å§format
ããåæ ·ï¼æä½çä¹åªæ¯å±é¨åéæè åªè¯»çfinal,transientåéï¼ä¹æ²¡æé®é¢ï¼
ãã
ããOkï¼å°±è¿æ ·è¾¾å°äºthread-safe.
ThreadLocal与SimpleDateFormat
首先介绍WeakReference。获得弱引用有两种方法:一是源码声明一个实例,二是源码继承WeakReference。接下来说明ThreadLocal的源码阿里聚源码用途。
内存泄漏是源码ThreadLocal的一个常见问题。内存泄漏的源码对象通常是存储的Object。Thread类有一个名为threadLocals的源码属性变量,类型为ThreadLocal.ThreadLocalMap。源码Entry的源码key指向ThreadLocal,因此一个ThreadLocal只能存储一个Object对象。源码存储多个Object对象需要多个ThreadLocal。源码wifi探针源码ThreadLocal被垃圾回收后,源码ThreadLocalMap中对应的源码Entry的键值会变成null,但是源码Entry是强引用,Entry存储的源码Object无法进行回收。
为了防止内存泄露,openjdk我源码ThreadLocalMap进行了一些额外的回收工作。在set、get以及resize等方法中,会自动删除stale slots,也就是救赎1.0源码过期的Entry。如果执行remove方法,可以彻底避免内存泄露。
在阿里巴巴开发规范中,将ThreadLocal定义为静态成员的一个好处是,在ThreadLocalMap里对应的99茶馆源码Entry的键会永远存在。这样在执行remove操作时,就可以正确定位并删除。
应用方面,推荐使用DataUtils工具类替代不安全的SimpleDateFormat。同时,SimpleDateFormat与ThreadLocal结合使用可以提高代码的可维护性。
最佳实践方面,如果在Java8应用中,可以使用DateTimeFormatter替代SimpleDateFormat,因为它更线程安全。
最后,FastThreadLocal是一种优化的ThreadLocal实现,可以提高性能。
关于SimpleDateFormat,它可以将日期格式化为String类型,使用方法如下:String dataStr = sdf.format(date);同时,它还可以将字符串解析为Date类型:Date date = sdf.parse(str);。如果在Java8应用中,推荐使用DateTimeFormatter,因为它提供了更好的线程安全性和性能。