Tomcat8中的并发ConcurrentDateFormat的实现
2019独角兽企业重金招聘Python工程师标准>>>
今天偶然想起翻翻tomcat源码,果然每次翻源码都有不小的收获。
下面我带领大家看下tomcat8中的ConcurrentDateFormat源码和实现。
源码如下:
/*** {@link SimpleDateFormat}的线程安全包装器。* 不使用ThreadLocal,创建足够的SimpleDateFormat对象来满足并发性要求。*/
public class ConcurrentDateFormat {private final String format;private final Locale locale;private final TimeZone timezone;private final Queue<SimpleDateFormat> queue = new ConcurrentLinkedQueue<>();public static final String RFC1123_DATE = "EEE, dd MMM yyyy HH:mm:ss zzz";public static final TimeZone GMT = TimeZone.getTimeZone("GMT");private static final ConcurrentDateFormat FORMAT_RFC1123;static {FORMAT_RFC1123 = new ConcurrentDateFormat(RFC1123_DATE, Locale.US, GMT);}public static String formatRfc1123(Date date) {return FORMAT_RFC1123.format(date);}public ConcurrentDateFormat(String format, Locale locale,TimeZone timezone) {this.format = format;this.locale = locale;this.timezone = timezone;SimpleDateFormat initial = createInstance();queue.add(initial);}public String format(Date date) {SimpleDateFormat sdf = queue.poll();if (sdf == null) {sdf = createInstance();}String result = sdf.format(date);queue.add(sdf);return result;}private SimpleDateFormat createInstance() {SimpleDateFormat sdf = new SimpleDateFormat(format, locale);sdf.setTimeZone(timezone);return sdf;}
}
tomcat8中并没有采用ThreadLocal的实现方式,而是用了一个并发队列。
format
时先从队列中弹出一个SimpleDateFormat,为null时则创建并添加进队列。
这样随着线程数的增长,队列中的SimpleDateFormat对象将会趋于饱和,减少高并发下对象的创建,提高性能。
转载于:https://my.oschina.net/qq596392912/blog/877849
Tomcat8中的并发ConcurrentDateFormat的实现相关推荐
- .NET Core 中的并发编程
今天我们购买的每台电脑都有一个多核心的 CPU,允许它并行执行多个指令.操作系统通过将进程调度到不同的内核来发挥这个结构的优点. 然而,还可以通过异步 I/O 操作和并行处理来帮助我们提高单个应用程序 ...
- Shell脚本中的并发(2)
转载 http://blog.csdn.net/wangtaoking1/article/details/9965271 上篇主要是写的如何在Shell脚本中编写并发程序,这次写一下如何控制进程的数量 ...
- 在 .NET Core 中的并发编程
原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 C ...
- [翻译]在 .NET Core 中的并发编程
原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 C ...
- oracle中dbms_并发和由于DBMS中的并发导致的问题
oracle中dbms 并发 (Concurrency) The ability of a database system which handles simultaneously or a numb ...
- Draconian,自由或保姆状态:Java,C#,C,C ++,Go和Rust中的并发意识形态
为什么我们需要并发 (Why we need Concurrency) Once, there was a good old time when clock speed doubled every 1 ...
- Swing中的并发-使用SwingWorker线程模式
Swing中的并发-使用SwingWorker线程模式 原创作品http://zhangjunhd.blog.51cto.com/113473/34727 Blog: [url]http://zhan ...
- tcp并发服务器_在Go中构建并发TCP服务器
tcp并发服务器 本文是Mihalis Tsoukalos的"围棋"系列的一部分. 阅读第1部分: 在Go中创建随机,安全的密码 . TCP和UDP服务器无处不在,通过TCP / ...
- go高性能tcp服务器,在Go中构建并发TCP服务器
开发一个并发TCP服务器,该服务器仅使用大约65行GO代码生成随机数. TCP和UDP服务器随处可见,通过TCP/IP网络为网络客户端提供服务.在本文中,我将在GO编程语言,返回随机数.对于来自TCP ...
最新文章
- CBV 验证装饰器的使用
- javascript 之 this 用法
- Android 获取手机的UUID
- Ajax:一种网页开发技术(Asynchronous Javascript + XML)
- Head First HTML与CSS、XHTML++笔记(第四章 WEB镇之旅 第五章 认识媒体)
- SqlSessionTemplate是如何保证MyBatis中SqlSession的线程安全的?
- JAVA与C#的区别
- 电商系统设计之商品接口
- 计算机二级Python笔记——第一部分
- mysql 修改数据库字段update_SQL语句update修改数据库字段
- [Revit教程]斑马:分享一个用Revit自适应构件做安全疏散距离分析的方法#S007
- 成功解决sklearn.exceptions.NotFittedError: This StandardScaler instance is not fitted yet. Call ‘fit‘ wi
- howlerjs 音乐播放插件
- h3c 链路聚合测试_H3C链路聚合
- 帕斯卡三角形题解(Python代码实现)
- 3.0 Appt2的异常问题 不一定需要关闭才能通过编译
- 机器学习系列思维导图
- 【深度森林算法实践】分类与回归
- HTML 字体图标如何使用
- 化工行业批号分类管理和编码管理