SimpleDateFormat线程安全测试用例

众所周知 SimpleDateFormat在多线程环境下是不安全的,具体可以参考https://blog.csdn.net/csdn_ds/article/details/72984646,其本质原因是多线程存在共享变量,导致数据处理结果不一致甚至错误,具体的解决方案:

(1)将共享变量设置为局部变量,每个线程私有化;

(2)在使用共享变量的时候进行加锁处理,虽然可以解决问题,但是效率低下;

(3)使用ThreadLocal变量将共享变量隔离

这些处理方式的本质就是共享变量私有化处理,本文针对第三种方式,基于JDK1.8进行简单的测试使用,具体如下,如果需要的童鞋,可以自行验证。

package spring.annotation.day4.threadlocal;

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.*;

/**
 * @author : cuantianhou 2020/4/8
 */
public class PrintDate {

    /**
     * 线程共享变量
     */
    static ThreadLocal dateFormat = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));

    /**
     * 设置线程名
     */
    private static final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("THREAD_POOL-%d").build();

    /**
     * 定义线程池
     */
    public static ExecutorService executorService =  new ThreadPoolExecutor(1, 2,
    10, TimeUnit.MINUTES,new LinkedBlockingQueue<>(), threadFactory);

    /**
     * 日期转字符串
     * @param seconds
     * @return
     */
    public String date(int seconds){
        try {
            Date date = new Date(1000 * seconds);
            return dateFormat.get().format(date);
        }finally {
            dateFormat.remove();
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            int finalI = i;
            executorService.submit(()-> System.out.println(new PrintDate().date(finalI)));
        }
    }
}

参考文章:https://mp.weixin.qq.com/s?__biz=MzUxOTc4NjEyMw==&mid=2247486133&idx=2&sn=1f2edc3f21c85de49a5dafd0f7b99e8c&chksm=f9f51151ce829847754994cf081fb53fd1f11585e0cd89cd9d74159e7527d06dbbea06f804f3&mpshare=1&scene=1&srcid=&sharer_sharetime=1586330543316&sharer_shareid=edbb749aced6294881c23a9c2387a8e9&rd2werd=1#wechat_redirect

你可能感兴趣的:(java基础知识,基础知识,线程池)