SimpleDateFormat线程不安全原因及解决方案
2020-12-13 01:53
标签:线程安全 使用 delegate auth zed exec dfa tst override 线程不安全验证: 输出: true 出现了false,说明线程不安全 1、format方法 可以看到,多个线程之间共享变量calendar,并修改calendar,因此在多线程环境下,线程是不安全的。 解决方案: 1、将SimpleDateFormat定义成局部变量 2、 加一把线程同步锁:synchronized(lock) 3、使用ThreadLocal,每个线程都拥有自己的SimpleDateFormat对象副本 如: 4、使用DateTimeFormatter代替SimpleDateFormat SimpleDateFormat线程不安全原因及解决方案 标签:线程安全 使用 delegate auth zed exec dfa tst override 原文地址:https://www.cnblogs.com/yangyongjie/p/11017409.html/**
* SimpleDateFormat线程安全测试
* 〈功能详细描述〉
*
* @author 17090889
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class SimpleDateFormatTest {
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(10, 100, 1, TimeUnit.MINUTES, new LinkedBlockingQueue(1000), new MyThreadFactory("SimpleDateFormatTest"));
public void test() {
while (true) {
poolExecutor.execute(new Runnable() {
@Override
public void run() {
String dateString = simpleDateFormat.format(new Date());
try {
Date parseDate = simpleDateFormat.parse(dateString);
String dateString2 = simpleDateFormat.format(parseDate);
System.out.println(dateString.equals(dateString2));
} catch (ParseException e) {
e.printStackTrace();
}
}
});
}
}
false
true
true
falsepublic StringBuffer format(Date date, StringBuffer toAppendTo,
FieldPosition pos)
{
pos.beginIndex = pos.endIndex = 0;
return format(date, toAppendTo, pos.getFieldDelegate());
}
// Called from Format after creating a FieldDelegate
private StringBuffer format(Date date, StringBuffer toAppendTo,
FieldDelegate delegate) {
// Convert input date to time field list
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++] ;
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;
}
protected Calendar calendar;
/**
* SimpleDateFormat线程安全测试
* 〈功能详细描述〉
*
* @author 17090889
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class SimpleDateFormatTest {
ThreadLocal
文章标题:SimpleDateFormat线程不安全原因及解决方案
文章链接:http://soscw.com/essay/24438.html