打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ThreadLocal使用案例

今日科技快讯

近日,支付宝更新了APP,推出“AR实景红包”的玩法,将主战场由线上转至线下。这是一种基于“LBS+AR+红包”的互动方式,用户在发、抢红包时,都需要满足地理位置和AR实景扫描两个条件。而AR红包将分为「个人对个人」红包和「商家对个人」红包。

有意思的是,QQ团队也于近日宣布,明年1月份将正式推出AR红包。并同时强调,这次想法来源于今年奥运期间的“AR火炬传递”。但关于微信红包方面,目前并没有任何消息。

作者简介

早上好,度过了愉快的圣诞,又到了跟大家见面的时候!

本篇来自 IT小生 的投稿,分享了他是如何使用 java.lang.ThreadLocal 来改进公司项目的。一篇实践文章,希望能帮助到有需要的朋友。

IT小生 的博客地址:

http://blog.csdn.net/u012706811

前言

最近整理公司项目,发现不少写的比较糟糕的地方,比如下面这个:


首先分析下:

该处的函数 parseymdhms() 使用了 synchronized 修饰,意味着该操作是线程不安全的,所以需要同步,线程不安全也只能是 SimpleDateFormatparse() 方法,查看下源码,在 SimpleDateFormat 里面有一个局部变量


clear() 操作会造成线程不安全.

改进方法

线程不安全是源于多线程使用了共享变量造成,所以这里使用 ThreadLocal 来给每个线程单独创建副本变量,先给出代码,再分析这样的解决问题的原因.


测试

在主线程中执行一个,另外两个在子线程执行,使用的都是同一个 pattern


日志分析:


分析

可以看出来 sdfMap put 进去了一次,而 SimpleDateFormatnew 了三次,因为代码中有三个线程.那么这是为什么呢?

对于每一个线程 Thread,其内部有一个 ThreadLocal.ThreadLocalMap threadLocals 的全局变量引用,ThreadLocal.ThreadLocalMap 里面有一个保存该 ThreadLocal 和对应 value,一图胜千言,结构图如下:

那么对于 sdfMap 的话,结构图就变更了下:

那么日志为什么是这样的?分析下:

1. 首先第一次执行 DateUtil.formatDate(new Date(),MDHMSS);


这个时候可能有人会问,这里并没有调用 ThreadLocal set 方法,那么值是怎么设置进入的呢?

这就需要看 sdfThread.get() 的实现:


也就是说当值不存在的时候会调用 setInitialValue() 方法,该方法会调用 initialValue() 方法,也就是我们覆盖的方法.

对应日志打印:


2. 第二次在子线程执行 DateUtil.formatDate(new Date(),MDHMSS);


分析 sdfThread.get():


对应日志:

Thread[Thread-0,5,main] init pattern: MMddHHmmssSSS

同理第三次执行和第二次类似.直接调用 sdfThread.get(),然后调用 initialValue() 方法,对应日志:

Thread[Thread-1,5,main] init pattern: MMddHHmmssSSS

总结

在什么场景下比较适合使用 ThreadLocal?stackoverflow上有人给出了还不错的回答。

When and how should I use a ThreadLocal variable?

One possible (and common) use is when you have some object that is not thread-safe, but you want to avoid synchronizing access to that object (I’m looking at you, SimpleDateFormat). Instead, give each thread its own instance of the object.

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
详细领悟ThreadLocal变量
SimpleDateFormat 造成的时间浪费
ThreaLocal内存泄露的问题
ThreadLocal&MDC内存泄漏问题
(三)睡眠阻塞
深入理解Java:SimpleDateFormat安全的时间格式化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服