Java ThreadLocal 线程安全问题解决方案
程序员文章站
2024-03-13 11:35:39
一、线程安全问题产生的原因
线程安全问题都是由全局变量及静态变量引起的
二、线程安全问题
simpledateformate sdf = new simple...
一、线程安全问题产生的原因
线程安全问题都是由全局变量及静态变量引起的
二、线程安全问题
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); } } }
感谢阅读本文,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: Java并发控制机制详解
推荐阅读
-
Java ThreadLocal 线程安全问题解决方案
-
Java ThreadLocal 线程安全问题解决方案
-
JAVA基础----ThreadLocal正确理解(转) 博客分类: JAVA基础 threadlocal线程共享变量
-
深入解析Java中ThreadLocal线程类的作用和用法
-
深入解析Java中ThreadLocal线程类的作用和用法
-
Java中的线程同步与ThreadLocal无锁化线程封闭实现
-
Java中的线程同步与ThreadLocal无锁化线程封闭实现
-
简单分析Java线程编程中ThreadLocal类的使用
-
简单分析Java线程编程中ThreadLocal类的使用
-
java 中ThreadLocal本地线程和同步机制的比较