public class Test {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(20,20,0L, TimeUnit.SECONDS,new LinkedBlockingDeque<>());
for (int i = 0;i<20;i++){
executor.execute(()-> {
try {
//System.out.println(DateUtilUnSafe.parse("2020-08-20 20:35:22"));
System.out.println(DateUtilSafe.parse("2020-08-20 20:35:22"));
} catch (ParseException e) {
e.printStackTrace();
}
});
}
executor.shutdown();
}
}
package ThreadLocal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;
public final class DateUtilUnSafe {
private static final SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// /**
// * 加了同步
// * @param dateStr
// * @return
// * @throws ParseException
// */
// public static final synchronized Date parse(String dateStr) throws ParseException {
// Date date = null;
// date = time.parse(dateStr);
// return date;
// }
/**
* 非同步
* @param dateStr
* @return
* @throws ParseException
*/
public static Date parse(String dateStr) throws ParseException {
Date date = null;
date = time.parse(dateStr);
return date;
}
}
package ThreadLocal;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public final class DateUtilSafe {
private static final ThreadLocal<DateFormat> THREAD_LOCAL = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
/**
* 非同步
* @param dateStr
* @return
* @throws ParseException
*/
public static final Date parse(String dateStr) throws ParseException {
Date date = null;
date = THREAD_LOCAL.get().parse(dateStr);
THREAD_LOCAL.remove();
return date;
}
}
DateUtilUnSafe如果不加synchronized多线程情况下会出现安全性问题,可以采用synchronized利用锁机制保证安全性,也可以采用
private static final ThreadLocal<DateFormat> THREAD_LOCAL = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); //为每个线程单独提供一份副本,使每个线程互不影响的使用