ThreadLocal 替代synchronized 写法

public class Test {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(20,20,0L, TimeUnit.SECONDS,new LinkedBlockingDeque<>());
        for (int i = 0;i<20;i++){
            executor.execute(()-> {
                try {
                    //System.out.println(DateUtilUnSafe.parse("2020-08-20 20:35:22"));
                    System.out.println(DateUtilSafe.parse("2020-08-20 20:35:22"));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            });
        }

        executor.shutdown();

    }
}

  

package ThreadLocal;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;

public final class DateUtilUnSafe {

    private  static final SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

//    /**
//     * 加了同步
//     * @param dateStr
//     * @return
//     * @throws ParseException
//     */
//    public static final synchronized Date parse(String dateStr) throws ParseException {
//        Date date = null;
//        date = time.parse(dateStr);
//        return  date;
//    }
    /**
     * 非同步
     * @param dateStr
     * @return
     * @throws ParseException
     */
    public static  Date parse(String dateStr) throws ParseException {
        Date date = null;
        date = time.parse(dateStr);
        return  date;
    }
}

  

package ThreadLocal;

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

public final class DateUtilSafe {

    private  static final ThreadLocal<DateFormat> THREAD_LOCAL = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));



    /**
     * 非同步
     * @param dateStr
     * @return
     * @throws ParseException
     */
    public static final Date parse(String dateStr) throws ParseException {
        Date date = null;
        date = THREAD_LOCAL.get().parse(dateStr);
        THREAD_LOCAL.remove();
        return  date;
    }
}
DateUtilUnSafe如果不加synchronized多线程情况下会出现安全性问题,可以采用synchronized利用锁机制保证安全性,也可以采用
private  static final ThreadLocal<DateFormat> THREAD_LOCAL = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));  //为每个线程单独提供一份副本,使每个线程互不影响的使用

posted on 2021-09-12 21:55  潮流教父孙笑川  阅读(115)  评论(0)    收藏  举报

导航