皮皮网

【数据分割源码java】【班级打卡源码】【好好住源码】fastdateformat源码

2024-11-20 01:38:22 来源:易语言 采集 源码

1.commons-lang DateFormatUtils 为什么线程安全
2.ThreadLocal与SimpleDateFormat

fastdateformat源码

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的源码数据分割源码java用途。

       内存泄漏是源码ThreadLocal的一个常见问题。内存泄漏的源码对象通常是存储的Object。Thread类有一个名为threadLocals的源码属性变量,类型为ThreadLocal.ThreadLocalMap。源码Entry的源码key指向ThreadLocal,因此一个ThreadLocal只能存储一个Object对象。源码存储多个Object对象需要多个ThreadLocal。源码班级打卡源码ThreadLocal被垃圾回收后,源码ThreadLocalMap中对应的源码Entry的键值会变成null,但是源码Entry是强引用,Entry存储的源码Object无法进行回收。

       为了防止内存泄露,好好住源码ThreadLocalMap进行了一些额外的回收工作。在set、get以及resize等方法中,会自动删除stale slots,也就是滑稽东源码过期的Entry。如果执行remove方法,可以彻底避免内存泄露。

       在阿里巴巴开发规范中,将ThreadLocal定义为静态成员的一个好处是,在ThreadLocalMap里对应的linux swap源码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,因为它提供了更好的线程安全性和性能。