分享

传统时间格式化的线程安全问题

 Coder编程 2022-10-22 发布于北京

一、传统使用方式存在安全性问题

        针对DateFormat

public static void main(String[] args) throws Exception {
		ExecutorService pool = Executors.newFixedThreadPool(10);
	
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		
		Callable<Date> task = new Callable<Date>() {

			@Override
			public Date call() throws Exception {
				return df.parse("2021-03-08");
			}
			
		};
		
		List<Future<Date>> list = new ArrayList<>();
		
		for(int i = 0; i < 10; i++) {
			Future<Date> submit = pool.submit(task);
			list.add(submit);
		}
		
		for(Future<Date> future : list) {
			System.out.println(future.get());
		}
		
		pool.shutdown();
}

二、解决方法一

            使用ThreadLocal加锁

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/** 
* @ClassName: DateFormatThreadLocal 
* @Description: TODO
* @author Liu 
* @date 2021年3月8日 上午11:36:42 
*/
public class DateFormatThreadLocal {

	public static final ThreadLocal<DateFormat> THREAD_LOCAL = new ThreadLocal<DateFormat>() {
		protected DateFormat initialValue() {
	        return new SimpleDateFormat("yyyy-MM-dd");
	    }
	};
	
	public static Date convert(String str) throws Exception {
		return THREAD_LOCAL.get().parse(str);
	}
}
public static void main(String[] args) throws Exception {
		ExecutorService pool = Executors.newFixedThreadPool(10);
		
		Callable<Date> task = new Callable<Date>() {
			
			@Override
			public Date call() throws Exception {
				return DateFormatThreadLocal.convert("2021-03-08");
			}
			
		};
		
		List<Future<Date>> list = new ArrayList<>();
		
		for(int i = 0; i < 10; i++) {
			Future<Date> submit = pool.submit(task);
			list.add(submit);
		}
		
		for(Future<Date> future : list) {
			System.out.println(future.get());
		}
		
		pool.shutdown();
	}

三、解决方法二

        使用java8新的日期api DateTimeFormatter

public static void main(String[] args) throws Exception {
		ExecutorService pool = Executors.newFixedThreadPool(10);
		
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
		
		Callable<LocalDate> task = new Callable<LocalDate>() {
			
			@Override
			public LocalDate call() throws Exception {
				return LocalDate.parse("2021-03-08", dtf);
			}
			
		};
		
		List<Future<LocalDate>> list = new ArrayList<>();
		
		for(int i = 0; i < 10; i++) {
			Future<LocalDate> submit = pool.submit(task);
			list.add(submit);
		}
		
		for(Future<LocalDate> future : list) {
			System.out.println(future.get());
		}
		
		pool.shutdown();
	}

 

showtooltip

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多