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的实现相关推荐

  1. .NET Core 中的并发编程

    今天我们购买的每台电脑都有一个多核心的 CPU,允许它并行执行多个指令.操作系统通过将进程调度到不同的内核来发挥这个结构的优点. 然而,还可以通过异步 I/O 操作和并行处理来帮助我们提高单个应用程序 ...

  2. Shell脚本中的并发(2)

    转载 http://blog.csdn.net/wangtaoking1/article/details/9965271 上篇主要是写的如何在Shell脚本中编写并发程序,这次写一下如何控制进程的数量 ...

  3. 在 .NET Core 中的并发编程

    原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 C ...

  4. [翻译]在 .NET Core 中的并发编程

    原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 C ...

  5. oracle中dbms_并发和由于DBMS中的并发导致的问题

    oracle中dbms 并发 (Concurrency) The ability of a database system which handles simultaneously or a numb ...

  6. Draconian,自由或保姆状态:Java,C#,C,C ++,Go和Rust中的并发意识形态

    为什么我们需要并发 (Why we need Concurrency) Once, there was a good old time when clock speed doubled every 1 ...

  7. Swing中的并发-使用SwingWorker线程模式

    Swing中的并发-使用SwingWorker线程模式 原创作品http://zhangjunhd.blog.51cto.com/113473/34727 Blog: [url]http://zhan ...

  8. tcp并发服务器_在Go中构建并发TCP服务器

    tcp并发服务器 本文是Mihalis Tsoukalos的"围棋"系列的一部分. 阅读第1部分: 在Go中创建随机,安全的密码 . TCP和UDP服务器无处不在,通过TCP / ...

  9. go高性能tcp服务器,在Go中构建并发TCP服务器

    开发一个并发TCP服务器,该服务器仅使用大约65行GO代码生成随机数. TCP和UDP服务器随处可见,通过TCP/IP网络为网络客户端提供服务.在本文中,我将在GO编程语言,返回随机数.对于来自TCP ...

最新文章

  1. CBV 验证装饰器的使用
  2. javascript 之 this 用法
  3. Android 获取手机的UUID
  4. Ajax:一种网页开发技术(Asynchronous Javascript + XML)
  5. Head First HTML与CSS、XHTML++笔记(第四章 WEB镇之旅 第五章 认识媒体)
  6. SqlSessionTemplate是如何保证MyBatis中SqlSession的线程安全的?
  7. JAVA与C#的区别
  8. 电商系统设计之商品接口
  9. 计算机二级Python笔记——第一部分
  10. mysql 修改数据库字段update_SQL语句update修改数据库字段
  11. [Revit教程]斑马:分享一个用Revit自适应构件做安全疏散距离分析的方法#S007
  12. 成功解决sklearn.exceptions.NotFittedError: This StandardScaler instance is not fitted yet. Call ‘fit‘ wi
  13. howlerjs 音乐播放插件
  14. h3c 链路聚合测试_H3C链路聚合
  15. 帕斯卡三角形题解(Python代码实现)
  16. 3.0 Appt2的异常问题 不一定需要关闭才能通过编译
  17. 机器学习系列思维导图
  18. 【深度森林算法实践】分类与回归
  19. HTML 字体图标如何使用
  20. 化工行业批号分类管理和编码管理

热门文章

  1. 浙大计算机 在职博士,浙江大学在职博士含金量高吗?
  2. Django创建应用和项目基本流程学习(二)
  3. 2018.4.13 用java配置/生成Xml文件 结合IO流知识点
  4. [转]windows中断与共享的连接(samba)
  5. C#在后台运行操作:BackgroundWorker的用法
  6. Android图形子系统
  7. 将图片序列压缩成视频
  8. [你必须知道的.NET]第十二回:参数之惑---传递的艺术(下)
  9. Web开发学习点滴(持续更新)
  10. 盘点最受欢迎的十个开源大数据技术