Java核心技术卷一 14.5.12 线程局部变量
发布日期:2021-06-29 02:39:44
浏览次数:2
分类:技术文章
本文共 956 字,大约阅读时间需要 3 分钟。
前面几节中, 我们讨论了在线程间共享变量的风险。有时可能要避免共享变量, 使用ThreadLocal 辅助类为各个线程提供各自的实例。 例如,SimpleDateFormat 类不是线程安全的。
假设有一个静态变量:public static final SimpleDateFormat dateFormat = new SimpleDateForniat("yyyy-MM-dd");
如果两个线程都执行以下操作:
String dateStamp = dateFormat.format(new Date());
结果可能很混乱,因为 dateFormat 使用的内部数据结构可能会被并发的访问所破坏。当然可以使用同步,但开销很大; 或者也可以在需要时构造一个局部 SimpleDateFormat 对象,不过这也太浪费了。
要为每个线程构造一个实例,可以使用以下代码:
public static final ThreadLocaldateFormat =ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
要访问具体的格式化方法,可以调用:
String dateStamp = dateFormat.get().format(new Date());
在一个给定线程中首次调用 get 时, 会调用 initialValue 方法。在此之后, get 方法会返回属于当前线程的那个实例。
在多个线程中生成随机数也存在类似的问题。java.util.Random 类是线程安全的。但是如果多个线程需要等待一个共享的随机数生成器, 这会很低效。
可以使用 ThreadLocal 辅助类为各个线程提供一个单独的生成器, 不过 Java SE 7 还另外提供了一个便利类。只需要做以下调用:
int random = ThreadLocalRandom.current().nextlnt(upperBound);
ThreadLocalRandom.current() 调用会返回特定于当前线程的 Random 类实例。
参考:
Java核心技术卷一基础知识第10版 14.5.12 线程局部变量转载地址:https://blog.csdn.net/yzpbright/article/details/106260357 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月11日 07时06分53秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
python初学者入门学习笔记:数据结构字典
2019-04-29
python初学者入门学习笔记:循环
2019-04-29
python初学者入门学习笔记:条件/跳出与结束循环
2019-04-29
python初学者入门学习笔记:运算符与随机数
2019-04-29
python初学者入门学习笔记:关键字
2019-04-29
python初学者入门学习笔记:内置函数
2019-04-29
python:Requests+正则爬取网页数据
2019-04-29
Python:模拟 Ajax 请求抓取今日头条街拍美图
2019-04-29
python使用代理处理反爬抓取微信文章
2019-04-29
IP代理池之验证是否有效
2019-04-29
python反爬虫之搭建IP代理池
2019-04-29
python爬取回车桌面图片
2019-04-29
python实现简单爬虫功能
2019-04-29
99%的人都不知道的pandas骚操作(一)
2019-04-29
24式加速你的Python
2019-04-29
Scrapy爬取银行理财产品信息(共12多万条)并存入MongoDB
2019-04-29
python贪吃蛇源码分享
2019-04-29
Python-WXPY实现微信监控报警
2019-04-29
Python Matplotlib plot函数用法:生成折线图
2019-04-29
Python读取csv文件(详解版,看了无师自通)
2019-04-29