当前位置:网站首页>FastDateFormat为什么线程安全
FastDateFormat为什么线程安全
2022-07-02 09:42:00 【徘徊在深夜中的猫】
原文链接 https://zhhll.icu/2021/第三方工具/1.FastDateFormat为什么线程安全/
FastDateFormat为什么线程安全
SimpleDateFormat的线程不安全
大家都知道SimpleDateFormat是线程不安全的
protected Calendar calendar;
SimpleDateFormat中的calendar是成员变量,同实例多个线程下会共享该calendar对象
而在进行格式化的时候可能会由于第一个线程还没有格式化完成,而第二个线程已经将时间修改了的情况
private StringBuffer format(Date date, StringBuffer toAppendTo,
FieldDelegate delegate) {
// 如果第一个线程设置了时间之后还没有格式化为字符串,此时第二个线程将时间覆盖掉,就会出现线程安全问题
calendar.setTime(date);
boolean useDateFormatSymbols = useDateFormatSymbols();
for (int i = 0; i < compiledPattern.length; ) {
int tag = compiledPattern[i] >>> 8;
int count = compiledPattern[i++] & 0xff;
if (count == 255) {
count = compiledPattern[i++] << 16;
count |= compiledPattern[i++];
}
switch (tag) {
case TAG_QUOTE_ASCII_CHAR:
toAppendTo.append((char)count);
break;
case TAG_QUOTE_CHARS:
toAppendTo.append(compiledPattern, i, count);
i += count;
break;
default:
subFormat(tag, count, delegate, toAppendTo, useDateFormatSymbols);
break;
}
}
return toAppendTo;
}
FastDateFormat如何处理的呢
那么FastDateFormat为什么是线程安全的呢?首先FastDateFormat是有一个缓存的,在进行实例化的时候是通过cache缓存来获取实例的
private static final FormatCache<FastDateFormat> cache= new FormatCache<FastDateFormat>() {
@Override
protected FastDateFormat createInstance(final String pattern, final TimeZone timeZone, final Locale locale) {
return new FastDateFormat(pattern, timeZone, locale);
}
};
public static FastDateFormat getInstance(final String pattern) {
return cache.getInstance(pattern, null, null);
}
将格式化格式、时区和国际化作为一个key存在了cInstanceCache中,cInstanceCache是一个ConcurrentHashMap,相当于相同的格式化格式、时区和国际化会使用同一个FastDateFormat实例
final MultipartKey key = new MultipartKey(pattern, timeZone, locale);
F format = cInstanceCache.get(key);
if (format == null) {
format = createInstance(pattern, timeZone, locale);
final F previousValue= cInstanceCache.putIfAbsent(key, format);
if (previousValue != null) {
// another thread snuck in and did the same work
// we should return the instance that is in ConcurrentMap
format= previousValue;
}
}
而在进行格式化的时候Calendar使用的是方法内部的局部变量,是不会出现线程安全问题的
public String format(final Date date) {
final Calendar c = newCalendar();
c.setTime(date);
return applyRulesToString(c);
}
边栏推荐
- [visual studio 2019] create MFC desktop program (install MFC development components | create MFC application | edit MFC application window | add click event for button | Modify button text | open appl
- MSI announced that its motherboard products will cancel all paper accessories
- How to Create a Beautiful Plots in R with Summary Statistics Labels
- ORB-SLAM2不同线程间的数据共享与传递
- Leetcode122 买卖股票的最佳时机 II
- 二分刷题记录(洛谷题单)区间的甄别
- R HISTOGRAM EXAMPLE QUICK REFERENCE
- Le tutoriel F - String le plus facile à comprendre de l'histoire.
- Filtre de profondeur de la série svo2
- 【C语言】十进制数转换成二进制数
猜你喜欢

H5, add a mask layer to the page, which is similar to clicking the upper right corner to open it in the browser

GGPlot Examples Best Reference

Filtre de profondeur de la série svo2

Natural language processing series (I) -- RNN Foundation

基于Arduino和ESP8266的Blink代码运行成功(包含错误分析)

Tiktok overseas tiktok: finalizing the final data security agreement with Biden government

R HISTOGRAM EXAMPLE QUICK REFERENCE

HOW TO ADD P-VALUES TO GGPLOT FACETS

Beautiful and intelligent, Haval H6 supreme+ makes Yuanxiao travel safer

二分刷题记录(洛谷题单)区间的甄别
随机推荐
Mish shake the new successor of the deep learning relu activation function
YYGH-BUG-04
YYGH-BUG-04
PHP query distance according to longitude and latitude
自然语言处理系列(一)——RNN基础
数据分析 - matplotlib示例代码
H5,为页面添加遮罩层,实现类似于点击右上角在浏览器中打开
Lekao: contents of the provisions on the responsibility of units for fire safety in the fire protection law
6. Introduce you to LED soft film screen. LED soft film screen size | price | installation | application
Power Spectral Density Estimates Using FFT---MATLAB
Thesis translation: 2022_ PACDNN: A phase-aware composite deep neural network for speech enhancement
Dynamic memory (advanced 4)
Repeat, tile and repeat in pytorch_ The difference between interleave
This article takes you to understand the operation of vim
[untitled] how to mount a hard disk in armbian
HOW TO CREATE AN INTERACTIVE CORRELATION MATRIX HEATMAP IN R
PX4 Position_ Control RC_ Remoter import
How to Visualize Missing Data in R using a Heatmap
Seriation in R: How to Optimally Order Objects in a Data Matrice
HOW TO EASILY CREATE BARPLOTS WITH ERROR BARS IN R