一次 SimpleDateFormat 引发的惨案(4)
- UID
- 1066743
|
一次 SimpleDateFormat 引发的惨案(4)
解决方案
方法一:
public class DataTool {
private static Logger logger = Logger.getLogger(DataTool.class);
public static String CCTToUTC(String timeString) {
try {
Date date = getDateSdf().parse(timeString);
Calendar calendar = Calendar.getInstance();
Date tgtDate = new Date(date.getTime() - calendar.getTimeZone().getRawOffset());
return getTimeZoneSdf().format(tgtDate);
} catch (Exception e) {
logger.warn(timeString + " parse err", e);
return getTimeZoneSdf().format(new Date());
}
}
private static SimpleDateFormat getTimeZoneSdf() {
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
}
private static SimpleDateFormat getDateSdf() {
return new SimpleDateFormat("yyyy-MM-dd");
}
}
复制代码
在需要用到 SimpleDateFormat 的地方就新建一个实例。不管什么时候,将有线程安全问题的对象由共享变为局部私有都能避免多线程问题,不过也加重了创建对象的负担。在一般情况下,这样其实对性能影响也不是那么明显。
方法二:
public class DateUtil {
private static Logger logger = Logger.getLogger(DataTool.class);
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private static SimpleDateFormat timeZoneSdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
public static String CCTToUTC(String timeString) {
try {
Date date = parse(timeString);
Calendar calendar = Calendar.getInstance();
Date tgtDate = new Date(date.getTime() - calendar.getTimeZone().getRawOffset());
return formatDate(tgtDate);
} catch (Exception e) {
logger.warn(timeString + " parse err", e);
return formatDate(new Date());
}
}
private static Date parse(String strDate) throws ParseException {
synchronized(sdf){
return sdf.parse(strDate);
}
}
private static String formatDate(Date date) throws ParseException {
synchronized(timeZoneSdf){
return sdf.format(date);
}
}
}
复制代码
当线程较多时,当一个线程调用该方法时,其他想要调用此方法的线程就要 block,多线程并发量大的时候会对性能有一定的影响。 |
|
|
|
|
|