dateformat线程_Java最佳实践–多线程环境中的DateFormat

dateformat线程

这是有关使用Java编程语言时的拟议实践的系列文章的第一篇。

所有讨论的主题均基于用例,这些用例源于电信行业关键任务超高性能生产系统的开发。

在阅读本文的每个部分之前,强烈建议您参考相关的Java API文档以获取详细信息和代码示例。

所有测试均针对具有以下特征的Sony Vaio进行:

  • 系统:openSUSE 11.1(x86_64)
  • 处理器(CPU):Intel(R)Core(TM)2 Duo CPU T6670 @ 2.20GHz
  • 处理器速度:1,200.00 MHz
  • 总内存(RAM):2.8 GB
  • Java:OpenJDK 1.6.0_0 64位

应用以下测试配置:

  • 并发工人线程:200
  • 每个工作人员重复测试的线程数:1000
  • 整体测试次数:100

在多线程环境中使用DateFormat

在多线程环境中使用DateFormat可能很棘手。 Java API文档明确指出:

日期格式不同步。 建议为每个线程创建单独的格式实例。 如果多个线程同时访问一种格式,则必须在外部进行同步。

典型的情况是使用预定义格式将日期转换为字符串表示形式,反之亦然。 为每次转换创建新的DateFormat实例效率很低。 您应该记住,静态工厂方法“ getDateInstance(..)”在使用时也会创建新的DateFormat实例。 大多数开发人员所做的就是使用DateFormat实现类(例如SimpleDateFormat )构造DateFormat实例,并将其值分配给类变量。 类范围的变量用于其所有日期解析和格式设置需求。 前面提到的方法虽然非常有效,但是由于DateFormat类上缺少同步,因此当多个线程访问类变量的相同实例时会引起问题。 解析创建Date对象时抛出的典型异常是:

  • java.lang.NumberFormatException
  • java.lang.ArrayIndexOutOfBoundsException

执行格式化时,您还应该遇到格式错误的“ 日期到字符串”表示形式。

为了正确处理上述问题,弄清多线程环境的体系结构至关重要。 Java虚拟机允许应用程序具有多个并行运行的执行线程。 通常,在多线程环境(JVM内部的容器或JVM本身)中,应执行线程池。 工作线程应在启动时构造并初始化,以用于执行程序。 例如,一个Web容器构造了一个工作线程池来服务所有传入的流量。 线程池是处理系统资源的最有效方法,主要是因为线程创建和初始化是Java虚拟机的高资源消耗任务。 不过,只需为要同时执行的每段代码创建一个新的执行线程 ,即可实现应用程序并行性。

关于类范围的DateFormat实例:

  • 如果你已经明确了NO 线程池将在您的环境中使用,那么只有新的主题实例同时访问你的DateFormat实例。 在这种情况下,建议从外部同步该DateFormat实例
  • 如果使用线程池,则可以同时访问DateFormat实例的线程实例数量有限。 因此,建议使用ThreadLocal方法为每个线程创建单独的DateFormat实例。

以下是“ getDateInstance(..)”,“同步”和ThreadLocal方法的示例:

package com.javacodegeeks.test;import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class ConcurrentDateFormatAccess {public Date convertStringToDate(String dateString) throws ParseException {return SimpleDateFormat.getDateInstance(DateFormat.MEDIUM).parse(dateString);}}
package com.javacodegeeks.test;import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class ConcurrentDateFormatAccess {private DateFormat df = new SimpleDateFormat("yyyy MM dd");public Date convertStringToDate(String dateString) throws ParseException {Date result;synchronized(df) {result = df.parse(dateString);}return result;}}

这里要注意的事情:

  • 每个执行“ convertStringToDate”操作的线程都试图在获取对DateFormat类变量instance的引用之前获取DateFormat对象的监视器锁定。 如果另一个线程持有该锁,则当前线程将等待直到释放该锁。 这样,一次只有一个线程正在访问DateFormat实例。
    package com.javacodegeeks.test;import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;public class ConcurrentDateFormatAccess {private ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat> () {@Overridepublic DateFormat get() {return super.get();}@Overrideprotected DateFormat initialValue() {return new SimpleDateFormat("yyyy MM dd");}@Overridepublic void remove() {super.remove();}@Overridepublic void set(DateFormat value) {super.set(value);}};public Date convertStringToDate(String dateString) throws ParseException {return df.get().parse(dateString);}}

    这里要注意的事情:

    • 每个执行“ convertStringToDate”操作的线程都将调用“ df.get()”操作,以初始化或检索其本地范围内的DateFormat实例的已初始化引用。

    下面,我们提供上述三种方法之间的性能比较表(注意,我们已经测试了DateFormat实用程序类的解析功能。根据特定的日期格式,我们将日期的String表示形式转换为等效的Date对象)。

    横轴表示测试运行的次数,纵轴表示每次测试运行的每秒平均事务数(TPS)。 因此,较高的值更好。 如您所见,通过使用线程池和ThreadLocal方法,与“同步”方法和“ getDateInstance(..)”方法相比,您可以获得更高的性能。

    最后,我要指出的是,使用不带线程池的ThreadLocal方法等同于使用“ getDateInstance(..)”方法,因为每个新线程都必须在使用之前初始化其本地DateFormat实例,因此需要一个新的DateFormat实例将在每次执行时创建。

    编码愉快!

    贾斯汀

    相关文章 :
    • Java最佳实践–高性能序列化
    • Java最佳实践– Vector vs ArrayList vs HashSet
    • Java最佳实践–字符串性能和精确字符串匹配
    • Java最佳实践–队列之战和链接的ConcurrentHashMap
    • Java最佳实践– Char到Byte和Byte到Char的转换

    翻译自: https://www.javacodegeeks.com/2010/07/java-best-practices-dateformat-in.html

    dateformat线程

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359642.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    关于图连通性的几道题(水)

    POJ 2186 强连通分量缩点 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 using namespace std;5 6 int en[10010], col[10010], dfn[10010], low[10010], stack[10010], tot[10010], chu[10010];7 bool ins[10010];8 int n, m, esize, dtime…

    一台计算机硬盘容量标为800gb,一台计算机的硬盘容量标为800GB,其存储容量是()。...

    台硬盘不适的装用于料是室外饰材。行的有_能进操作&#xff0c;计算机系统源管在W“资”中操作理器。不正有_确的&#xff0c;容量下列叙述中。的有描述正确&#xff0c;其存文输的中s系统下关于入。文档选定应_整篇&#xff0c;储容d文档编在W辑中。不能作进行_操&#xff0c;…

    jQuery验证插件

    jQuery验证插件 原文:jQuery验证插件学习要点&#xff1a; 1.使用 validate.js 插件 2.默认验证规则 3.validate()方法和选项 4.validate.js 其他功能 验证插件&#xff08;validate.js&#xff09;&#xff0c;是一款验证常规表单数据合法性的插件。使用它&#xff0c;极大的解…

    爱思助手更新后无法连接服务器,爱思助手出现无法连接或连接超时的操作教程...

    使用爱思助手的用户很多&#xff0c;一些新用户不清楚出现无法连接或连接超时怎样处理&#xff0c;今天小编给大家带来在爱思助手出现无法连接或连接超时的操作教程&#xff0c;希望可以帮到大家。爱思助手出现无法连接或连接超时的操作教程一、数据线和电脑USB接口正常状态请确…

    计算机演示题打不开,大神为你演示win7系统计算机上右键管理打不开的还原技巧...

    当我们经常使用的电脑工作的时候&#xff0c;时间久了难免会遇到win7系统计算机上右键管理打不开的问题&#xff0c;如今就有用户反映在使用电脑的时候遇到win7系统计算机上右键管理打不开的情况不知怎么解决&#xff0c;针对这个问题小编就整理总结出win7系统计算机上右键管理…

    apache lucene_Apache Lucene拼写检查器的“您是不是要”功能

    apache luceneGoogle的“您是不是要”功能 在上一篇文章中对Lucene进行了介绍之后 &#xff0c;现在是时候提高它并创建一个更复杂的应用程序了。 您肯定最熟悉Google的“您是不是要”功能&#xff08;其他搜索引擎也支持此功能&#xff09;。 这是一个例子&#xff1a; Luce…

    荣耀6手机常显示无法链接服务器怎么处理,华为手机连接上WiFi上不了网怎么办...

    华为手机(Mate7,荣耀6 Plus,荣耀6,P7) 连接上WiFi上不了网怎么办每当小编被遇到这样的问题&#xff0c;小编都会深深的醉一把。这样的问题就应该被消灭在火星上&#xff0c;谁让他来地球的。网络就像一张大网&#xff0c;哪个节点有问题都可能导致WIFI连上无法上网&#xff0c;…

    jboss 配置上下文路径_JBoss Portal上的“ Hello World” portlet

    jboss 配置上下文路径Portlet概述 本教程将向您展示如何创建和部署简单的Portlet。 Portlet是基于Java技术的Web组件&#xff0c;可以处理请求并生成动态内容。 Portlet不是自治实体&#xff0c;但是由Portlet容器管理&#xff0c;Portlet容器为Portlet执行提供了必要的运行时…

    创建型-工厂方法模式

    1、工厂方法模式意图&#xff1a; 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 工厂方法模式用于为属于同一类别的产品定义对应的具体工厂类&#xff0c;并将具体工厂类开放给用户类来使用。 2、应用场景&…

    服务器添加角色显示灰色,添加角色 web服务器 灰色

    添加角色 web服务器 灰色 内容精选换一换OneAccess支持通过AD认证用户身份和控制权限。AD全称Active Directory&#xff0c;中文名称活动目录。您可以将AD简单理解成一个数据库&#xff0c;其存储有关网络对象的信息&#xff0c;方便管理员和用户查找所需信息。本文主要介绍One…

    虚拟服务器关机怎么开,云服务器关机了怎么开启

    云服务器关机了怎么开启 内容精选换一换开启防护后&#xff0c;您可以根据需要进行安全配置。包括配置常用登录地、常用登录IP、SSH登录IP白名单&#xff0c;开启恶意程序自动隔离查杀功能。配置常用登录地后&#xff0c;企业主机安全服务将对非常用地登录主机的行为进行告警。…

    web文件怎么传到服务器,web文件传到服务器

    web文件传到服务器 内容精选换一换工具中所有涉及上传文件功能的&#xff0c;如果需要上传的文件大于1GB或者解压后超过剩余磁盘空间的一半&#xff0c;则需要释放磁盘空间或手动将文件上传至服务器&#xff0c;其他情况可通过Web界面上传功能上传。Web服务端证书&#xff0c;即…

    weblogic ejb_使用Oracle WebLogic对应用程序外部的EJB的引用

    weblogic ejb在之前的文章中&#xff0c;我们对EJB 3.0版及其为您提供的构建Java EE应用程序的可移植机制进行了概述。 由于Java EE规范都是关于可移植性的&#xff0c;因此冒着重复自我的风险&#xff0c;我们经常强调EJB v。3.0规范上仍然存在最重要的可移植性限制&#xff1…

    Android Studio显示行数

    Android Studio在打开的文件左側单击鼠标右键&#xff0c;也能像Eclipse一样设置显示代码行数&#xff0c;如图1。可是这边跟Eclipse有一个非常大的差别&#xff0c;Eclipse设置后&#xff0c;其余的相应文件也跟着生效&#xff0c;即使文件关闭后又一次打开行数也还是会显示&a…

    visio 小技巧

    Visio作图非常的方便 目前我还是用Visio2003&#xff0c;有一些小技巧&#xff0c;记录一下。 1、visio修改文本框文字对齐方式。默认的对齐方式是上下、左右居中。修改的位置: 在一个文档中可以插入多个标签页&#xff0c;当需要分页&#xff0c;用不同页归类不同信息的时候使…

    java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配

    java中字符串的精确匹配在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将讨论String性能调优。 我们将专注于如何有效地处理字符串创建&#xff0c; 字符串更改和字符串匹配操作。 此外&#xff0c;我们将提供我们自己的用于精确字…

    My.Ioc 代码示例——避免循环依赖

    本文的目的在于通过一些示例&#xff0c;向大家说明 My.Ioc 支持哪些类型的依赖关系。也就是说&#xff0c;如何设计对象不会导致循环依赖。 在 Ioc 世界中&#xff0c;循环依赖是一个顽敌。这不仅因为它会导致 Ioc 容器抛出异常&#xff0c;而且还因为它是不可预知的&#xff…

    asp.net中两款文本编辑器NicEdit和Kindeditor

    分类&#xff1a; C#/ASP.Net 2012-10-09 22:35 665人阅读 评论(0) 收藏 举报 文本编辑asp.nettextboxserveraspsafari目录(?)[] 做过Web开发的朋友相信都使用过富文本编辑器&#xff0c;比较出名的CuteEditor和CKEditor很多人应该已经使用过&#xff0c;在功能强大的同时需要…

    导出oracle awr分析报告,配置oracle内存参数,察看表空间使用率

    cmd 命令生成awr报告: cmd 窗口 输入 -> Sqlplus sys/orclorcl as sysdba (sys登陆oracle).导出awr命令 ?/rdbms/admin/awrrpt.sql 3..输入导出的文件格式 为 html 回车 4输入数字1 为导出今天的分析报告 &#xff0c;2 3 。。。&#xff0c;回车 5.输入开始 snap id…

    android多点触控自由对图片缩放

    在系统的相册中,观看相片就可以用多个手指进行缩放.要实现这个功能,只需要这几步:1.新建项目,在项目中新建一个ZoomImage.javapublic class ZoomImageView extends View {//初始化状态常量public static final int STATUS_INIT1;//图片放大状态常量public static final int STA…