关于线程不安全的SimpleDateFormat

来源:5-4 线程不安全类与写法-1

旺仔奶牛糖

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回答

Jimin

2019-01-07

你好,threadlocal我在课程里也有介绍,他由于做了线程间封闭,不同的线程间无法互相访问,因此可以保证线程安全。他虽然不是为了线程安全专门设计的,但是使用他解决一些线程安全问题特别有效。

0
2
菜鸟精髓
回复
旺仔奶牛糖
threadlocal 一般用于web保存用户信息,不会这么用的
2019-05-27
共2条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程