解决线程切换导致ThreadLocal值丢失
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决线程切换导致ThreadLocal值丢失相关的知识,希望对你有一定的参考价值。
参考技术A 1.jdk 自带的InheritableThreadLocal 只针对父子线程 有效,针对线程池失效2.使用阿里的transmittable-thread-local 可以解决线程池内的threadLocal 问题
只需要修改2个地方,修饰线程池和替换InheritableThreadLocal:
原文地址请点击此处
利用ThreadLocal解决SimplaDateFormat线程不安全的问题
在最近的工作中,无意中使用一个SimpleDateFormat把日期时间字符串转换为Date对象,发现存在时间很异常的情况,比如出现时间年份明显不对的情况。
后来在网上查看发现,原来是SimpleDateFormat不是线程安全导致的。后来改写了DateUtil,利用ThreadLocal达到线程安全效果。
ThreadLocal对象一个新线程里第一次被调用时,会调用initialValue方法,后续此线程就会用这个方法返回的对象进行处理,相当于每个线程有一个独立的SimpleDateFormat对象,达到了线程安全的效果。
1 class DateUtil{ 2 private static ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>(){ 3 protected SimpleDateFormat initialValue() { 4 return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 5 } 6 }; 7 public static Date parse(String strtime){ 8 try{ 9 return threadLocal.get().parse(strtime); 10 } catch( ParseException e){ 11 e.printStackTrace(); 12 } 13 return null; 14 } 15 16 public static String format(Date date){ 17 try{ 18 return threadLocal.get().format(date); 19 } catch( Exception e){ 20 e.printStackTrace(); 21 } 22 return null; 23 } 24 25 26 }
以上是关于解决线程切换导致ThreadLocal值丢失的主要内容,如果未能解决你的问题,请参考以下文章