SimpleDateFormat是个线程不安全的类,可参考:https://blog.csdn.net/paincupid/article/details/77531362
并且Joda-Time无论在安全还是其他方面都完胜SimpleDateFormat,可以全部使用Joda-Time
以下将如何实现Joda-Time
一,配置pom.xml
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9</version>
</dependency>
二,使用例子如下:
import concurrency.annotations.Recommend;
import concurrency.annotations.ThreadSafe;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/*
*Created by William on 2018/5/1 0001
* import org.joda.time.format.DateTimeFormat;
* 推荐使用这个类
*/
@Slf4j
@ThreadSafe
@Recommend
public class JodaTimeSafe {
private static DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern("yyyyMMdd");
public static int clientTotal = 5000;
public static int threadTotal = 200;
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
Semaphore semaphore = new Semaphore(threadTotal);
CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
for (int i = 0; i < clientTotal; i++) {
int finalI = i;
executorService.execute(new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
update(finalI);
semaphore.release();
} catch (Exception e) {
log.error("Exception", e);
}
countDownLatch.countDown();
}
});
}
countDownLatch.await();
executorService.shutdown();
}
public static void update(int i) {
log.info("{},{}", i, dateTimeFormat.parseDateTime("20180501").toDate());
}
}