zoukankan      html  css  js  c++  java
  • ThreadLocal解决线程安全问题

    一、线程安全问题产生的原因

    线程安全问题都是由全局变量及静态变量引起的

    二、线程安全问题

    SimpleDateFormate sdf = new SimpleDateFormat();使用sdf.parse(dateStr);sdf.format(date);在sdf内有一个对Caleadar对象的引用,在源码sdf.parse(dateStr);源码中calendar.clear();和calendar.getTime(); // 获取calendar的时间

    如果 线程A 调用了 sdf.parse(), 并且进行了 calendar.clear()后还未执行calendar.getTime()的时候,线程B又调用了sdf.parse(), 这时候线程B也执行了sdf.clear()方法, 这样就导致线程A的的calendar数据被清空了;

    ThreadLocal是使用空间换时间,synchronized是使用时间换空间

    使用ThreadLocal解决线程安全:

    public class ThreadLocalDateUtil {
        private static final String date_format = "yyyy-MM-dd HH:mm:ss";
        private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>(); 
     
        public static DateFormat getDateFormat()   
        {  
            DateFormat df = threadLocal.get();  
            if(df==null){  
                df = new SimpleDateFormat(date_format);  
                threadLocal.set(df);  
            }  
            return df;  
        }  
        public static String formatDate(Date date) throws ParseException {
            return getDateFormat().format(date);
        }
        public static Date parse(String strDate) throws ParseException {
            return getDateFormat().parse(strDate);
        }   
    }
    

    使用synchronized解决方案:

    public class DateSyncUtil {
        private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
          
        public static String formatDate(Date date)throws ParseException{
            synchronized(sdf){
                return sdf.format(date);
            }  
        }
        
        public static Date parse(String strDate) throws ParseException{
            synchronized(sdf){
                return sdf.parse(strDate);
            }
        } 
    }
    

      

  • 相关阅读:
    都不敢上CSDN了
    什么是函数(function)?
    今天3/8妇女节
    一件有意思的事情:关于std::string和std::auto_ptr
    转两篇Link相关的文章
    DevIL Downloads
    状态模式(State Pattern)
    访问者模式(Visitor Pattern)
    羊皮卷的故事第二章
    备忘录模式(Memento Pattern)
  • 原文地址:https://www.cnblogs.com/ablejava/p/5914090.html
Copyright © 2011-2022 走看看