欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java ThreadLocal 线程安全问题解决方案

程序员文章站 2024-03-12 15:24:32
一、线程安全问题产生的原因 线程安全问题都是由全局变量及静态变量引起的 二、线程安全问题 simpledateformate sdf = new simple...

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

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

二、线程安全问题

simpledateformate sdf = new simpledateformat();使用sdf.parse(datestr);sdf.format(date);在sdf内有一个对caleadar对象的引用,在源码sdf.parse(datestr);源码中calendar.clear();和calendar.gettime(); // 获取calendar的时间

Java ThreadLocal 线程安全问题解决方案

如果 线程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);
    }
  }
}

感谢阅读本文,希望能帮助到大家,谢谢大家对本站的支持!