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,一经查实,立即删除!

    相关文章

    计算机组装报告文档,计算机组装报告.doc.docx

    计算机组装与维护实训报告 2010-03-22 10:10计算机组装与维护实训报告 实习内容&#xff1a;计算机组装与维 护实习地点&#xff1a;学校机 房实 习目的&#xff1a; 通过计算机的组装&#xff0c; 认识计算机的硬件和结构&#xff0c; 了解计算机的整个组装过程和注意 事 项。…

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

    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…

    计算机教育 如何投稿,高职院校计算机教育论文投稿教育杂志-教育论文投稿

    教育学文摘》杂志征稿启示(杂志介绍)《教育学文摘》杂志创刊于1986年,系国家级教育类学术期刊&#xff0c;精选摘编有关教育理论研究和学校改革实践方面的优秀文章&#xff0c;由教育部主管&#xff0c;中国人民大学主办&#xff0c;面向国内外公开发行&#xff0c;本刊已被中国…

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

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

    提升您的Hibernate引擎

    是否想知道如何调整基于Hibernate的应用程序以获得无缝的可伸缩性和最佳性能&#xff1f; 本文探讨了基于Hibernate的应用程序的调整技术&#xff0c;重点是有效但文献记载不足的调整主题&#xff0c;例如继承映射&#xff0c;二级缓存和增强的序列标识符生成器。 它还提供了一…

    sql alter表字段处理

    --添加字段 ALTER table WCOLLECTION add CLT_ID int null default(0) --将已有字段类型为 NULL 修改为 NOT NULLalter table table_namealter column column_name char(20) not null--添加主键ALTER table WCOLLECTION add primary key (CLT_ID)转载于:https://www.cnblogs.c…

    流程图伪代码计算机语言,流程图与伪代码 PPT课件

    2018考纲分析,2018考纲分析,程序设计增加部分(适应2018新考纲),目录一、程序与算法介绍1.流程图2.伪代码二、程序的基本结构,一、程序与算法介绍,软件计算机程序文档资料程序数据结构算法程序设计方法语言工具和环境,算法的表示方法有很多种常用的有&#xff1a;自然语言、流程…

    2544 hdu

    // 顶点从1 开始 floyed#include <stdio.h>#define N 201#define INF 100000 int g[N][N],n,m; void floyed() { int i,j,k; for(k1;k<n;k) { for(i1;i<n;i) for(j1;j<n;j) if(g[i][j]>g[i][k]g[k][j]) g[i][j]g[i][k]g[k][j] ; } } int main(){ int i,j,x,y…

    笔记本计算机盖上盖子关机,笔记本电脑不关机就盖上盖子,这样好吗

    笔记本电脑不关机就盖上盖子不好&#xff0c;虽然在合上笔记本待机之后&#xff0c;主板和其他部件基本上都处于待命状态&#xff0c;硬盘由高速转入低速运转&#xff0c;但是待机状态下仍然有损耗&#xff0c;长时间不关机和重启&#xff0c;有些程序占据的内存得不到释放&…

    linux openjdk_OpenJDK作为Linux上的默认Java

    linux openjdk大家好&#xff0c; 最近&#xff0c;我收到了很多人的私人来信&#xff0c;他们对Linux默认Java软件包的更改感到困惑/担心。 对于许多Linux发行版&#xff0c;Java的官方Sun / Oracle版本已打包为该平台的默认Java。 但是&#xff0c;由于最近的许可更改&#x…

    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系统计算机上右键管理…

    gwt-2.8.2下载_GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示

    gwt-2.8.2下载不久前&#xff0c;我的一个朋友和同事向我飞过&#xff0c;说“世界上只有一半在使用Maven ”。 当我意识到最受欢迎的文章&#xff08;到目前为止&#xff09; GWT 2 Spring 3 JPA 2 Hibernate 3.5 Tutorial提出了一种基于Google的Web Toolkit&#xff08; GWT …

    111邮箱服务器设置,如何设置Outlook邮箱帐号

    在Outlook的邮箱帐号设置中&#xff0c;将POP3服务器和SMTP服务器设置成邮件服务器IP地址&#xff0c;帐号修改成"原登录帐号#原POP3服务器地址"就可以了。假设你已经有了一个 Internet 邮箱为webmasternetease.com 。netease.com的pop3服务器地址是 pop.netease.com…

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

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

    获取js里添加的css文件,用JS添加一个css文件

    我在这里发现了一些关于我的问题的问题&#xff0c;但我无法使用它。 通过JS点击它们时我会改变的CSS属性&#xff0c;JQuery的用JS添加一个css文件GreenRed/*$(document).ready(function() {$(".osn").mouseover(function() {uploadcss()});});*/$(document).ready(…

    __construct()和__initialize()

    ThinkPHP中的__initialize()和类的构造函数__construct()网上有很多关于__initialize()的说法和用法&#xff0c;总感觉不对头&#xff0c;所以自己测试了一下。将结果和大家分享。不对请更正。首先&#xff0c;我要说的是1、__initialize()不是php类中的函数&#xff0c;php类…

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

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

    初学之道--MFC

    放假了&#xff0c;由于作业需要&#xff0c;我开始学习了一下MFC&#xff0c;一开始不知道如何下手&#xff0c;对MFC消息的运行和管理都一概不知&#xff0c;稀里糊涂的去看windows核心编程教学&#xff0c;才知道什么叫看天书&#xff0c; 然后又下载了vs2010开发指南PDF来看…