关于线程不安全的SimpleDateFormat
来源:5-4 线程不安全类与写法-1
![](http://img1.sycdn.imooc.com/user/5b8cd1100001d0c102000200-100-100.jpg)
旺仔奶牛糖
2019-01-07
@Slf4j
@ThreadSafe
public class DateFormatExample4 {
public static int clientTotal = 5000;
public static int threadTotal = 200;
//线程封闭
private static final ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>(){
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyyMMdd");
}
};
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(threadTotal);
final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
for (int i = 0; i < clientTotal; i++) {
executorService.execute(() -> {
try {
semaphore.acquire();
update();
semaphore.release();
} catch (InterruptedException e) {
e.getStackTrace();
}
countDownLatch.countDown();
});
}
countDownLatch.await();
executorService.shutdown();
}
public static void update(){
try {
simpleDateFormatThreadLocal.get().parse("20190107");
} catch (ParseException e) {
log.error("parse exception:{}",e);
}
}
}
老师您好,我用ThreadLocal修饰SimpleDateFormat这个,然后也不报错了。
但是请教了ThreadLocal的用法,发现他不是为了解决线程安全设计的。
那这里使用之后,这个不报错了,解决了线程安全的问题吗?
写回答
1回答
-
你好,threadlocal我在课程里也有介绍,他由于做了线程间封闭,不同的线程间无法互相访问,因此可以保证线程安全。他虽然不是为了线程安全专门设计的,但是使用他解决一些线程安全问题特别有效。
022019-05-27
相似问题