`
xylong
  • 浏览: 191874 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

源码研究和case分享

阅读更多

 

项目终于接近尾声,下周上线,没有太多事情,为了保证代码质量,所以现在更多的事情是codereview,顺便也补充下能量,首先分享一个压力测试下的case吧,

simpleDateFormat作为全局变量时,存在线程不安全问题,容易引起值覆盖问题,当然在使用全局变量,高并发环境下又没使用线程安全的情况下,都会导致这个问题,虽然源代码很明白可以觉察这个问题,但还是贴上代码更有说服力:

 

 

package reference.unsafe;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Format {
	
	private static  DateFormat   dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	
	public static  String  formatYmdHms(Date date){
		
		try {
			return dateFormat.format(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
	
	public static String formatYmdHms1(Date date){
		try {
			return dateFormat.format(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
		
	}
	
	public static void main(String[] args) {
		
		System.out.println(new Date());
		
	}
	

}


-----------------------------------华丽分割------------------------------------------


package reference.unsafe;

import java.util.Calendar;
import java.util.Date;

public class Test {
	
	
	
	public static void main(String[] args) {
		
		Test tt = new Test();
		for (int i = 0; i < 50; i++) {
			tt.new formatD().start();
			tt.new formatM().start();
		}
		
	}
	
	class  formatD extends Thread{
		
		public formatD(){
			super.setName("QQ");
		}
		
		public void run(){
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("线程名称【"+Thread.currentThread().getName()+"】,当前时间:【"+new Date()+"】,格式后:【"+Format.formatYmdHms(new Date())+"】");
		    
		}
		
	}
	
   class  formatM extends Thread{
		
	   public formatM(){
			super.setName("PP");
		}
	   
		public void run(){
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			Calendar calendar = Calendar.getInstance();
			calendar.add(Calendar.HOUR_OF_DAY, 2);
			System.out.println("线程名称【"+Thread.currentThread().getName()+"】,当前时间:【"+new Date()+"】,格式后:【"+Format.formatYmdHms1(calendar.getTime())+"】");
		    
		}
		
	}
	
	

}
再分析下jdk下simpleDateFormat源码
 private StringBuffer format(Date date, StringBuffer toAppendTo,
                                FieldDelegate delegate) {
        // Convert input date to time field list
        calendar.setTime(date);
很容易看出多个线程都进入到format方法,更改了calendar,问题就发生了,如何解决这个问题呢?这里给出两种
解决方案吧,首先肯定是局部变量如:return new SimpleDateFormat("yyyy.MM.dd").format(new Date());

也可以使用副本:
 private static ThreadLocal ymdFormatThreadLocal = new ThreadLocal() {
	  protected  Object initialValue() {
	   return new SimpleDateFormat("yyyyMMdd");
	  }
	 };
这里再贴上一遍参考文章,他的系列代码之丑文章,不错,作为java开发人员可以参考,引以为戒
http://www.infoq.com/cn/news/2012/06/ugly-code-12

最后为了给自己补充能量,贴上两个开源代码svn,有兴趣的同学可以研究下
http://svn.apache.org/repos/asf/tomcat/tc7.0.x/trunk
https://github.com/taobao/tedis






分享到:
评论

相关推荐

    C语言项目开发源码分享.zip_C语言经典 C源码_C语言项目开发_C语言项目源码_c语言项目

    在这个名为"C语言项目开发源码分享.zip"的压缩包中,包含了...总之,这个压缩包中的C语言项目源码是学习和提升C语言技能的宝贵材料,无论是为了巩固基础知识,还是为了探索更高级的编程技巧,都值得仔细研究和实践。

    PHP实例开发源码-PHP兴趣分享图谱程序带淘宝客.zip

    该压缩包文件“PHP实例开发源码-PHP兴趣分享图谱程序带淘宝客.zip”包含了一个基于PHP语言的实例开发...解压并研究源码将能提供更深入的洞见。通过这个项目,开发者可以学习到实际的PHP开发流程,提升Web应用开发技能。

    企业网站asp源码

    ASP源码的免费分享对初学者和开发者来说非常有益,因为它们提供了一个学习和理解动态网站开发的实例。通过研究这些源码,开发者可以学习如何使用ASP处理服务器端逻辑,如何与数据库交互,以及如何构建动态、交互式的...

    MATLAB2011a-程序源码

    MATLAB2011a是一款由MathWorks...总之,“MATLAB2011a-程序源码”是学习MATLAB编程的宝贵资源,通过深入研究和实践,不仅可以掌握MATLAB的基本用法,还能提高解决问题的能力,为你的学术研究或工程应用打下坚实基础。

    PHP实例开发源码—一麦短网址源码清新版(支持SAE环境).zip

    这个实例开发源码是一麦短网址的清新版,设计用于创建简短的URL,方便在社交媒体、短信或电子邮件中分享长链接。支持SAE(Sina App Engine)环境意味着该源码可以在新浪云平台上运行,无需自行搭建服务器,降低了...

    day18_case_JavaWeb_源代码.zip

    【标题】"day18_case_JavaWeb_源代码.zip" 涉及的是一个JavaWeb项目的源码案例,这通常是指使用Java语言开发的Web应用程序。JavaWeb是Java技术在互联网领域的应用,用于构建动态网站和Web应用程序。在这个案例中,...

    PHP实例开发源码——PHP仿Pinterest图谱程序仿花瓣模板.zip

    【PHP实例开发源码——PHP仿Pinterest图谱程序仿花瓣模板.zip】是一个包含PHP源代码的压缩包,其设计目标是实现一个类似于Pinterest和花瓣网的图片分享与收集平台。这个项目对于学习PHP编程,尤其是涉及到图片处理、...

    PHP实例开发源码——红色风格政府协会建站系统(带小程序).zip

    【PHP实例开发源码——红色风格政府协会建站系统(带小程序)】 ...它以其灵活性、易学性和与Web交互的能力而受到开发者的...通过深入研究源码,可以提升对PHP编程、数据库设计、前端技术以及小程序开发的理解和实践能力。

    Android应用源码之MyMenuActionMode.zip

    在Android开发中,`MyMenuActionMode.zip`这个压缩包可能包含了一个自定义的菜单Action Mode的示例项目。...通过研究这个示例,你可以了解到如何将Action Mode优雅地集成到你的应用中,提高用户的交互体验。

    易语言24点计算器

    易语言24点计算器源码是易语言开发者分享的一个项目,通过阅读和分析这个源码,我们可以深入理解易语言编程的基本结构、控制流程以及算法设计。 首先,24点计算器的实现关键在于枚举所有可能的运算组合。这需要对四...

    java简单的源码-JavaSourceCodes:用Java解决基于简单逻辑的问题

    首先,从"系统开源"的标签我们可以推断,这些源码是开放给公众查看、学习和使用的,遵循开源许可证,这为开发者提供了自由地研究、修改和分享代码的机会。开源社区通常充满活力,提供了一个互动和学习的良好环境,...

    ubuntu22 py310 carla 0.9.14 whl文件

    通过分享这样的资源,开发者社区得以更高效地进行自动驾驶技术的研究和开发。在实际操作中,用户需要先确保自己的系统环境符合要求,然后使用pip工具来安装这个whl文件,以快速搭建起CARLA的运行环境。

    东方标准 面试材料 问题+技巧 (内部资料)

    1. **JDK核心类库**:深入研究Collections类、Arrays类、StringBuilder和StringBuffer类的源码,理解其实现原理。 2. **并发工具类**:例如Semaphore、CyclicBarrier、CountDownLatch等的用法及源码分析。 3. **...

    完整的C++课件以及笔记整理

    这份"完整的C++课件以及笔记整理"是学习C++的宝贵资源,包括了课件、源码和笔记,适合初学者和有一定基础的学习者进行深入研究。 一、C++基础知识 C++是C语言的扩展,它引入了类和对象的概念,实现了面向对象编程...

    精美企业整站 美工一流

    用户可以通过研究这些源码了解企业网站的常规结构,学习如何处理常见功能如招聘、用户注册、案例展示等,并且可以根据自己的需求进行个性化定制。同时,用户应当遵守不传播的规则,尊重知识产权。

    ContextMenu 上下文选项菜单,长按后跳出菜单.zip

    在Android操作系统中,"ContextMenu"(上下文选项菜单)是一种重要的用户交互机制,它允许用户在长按某个项目时访问与该项目相关的特定...通过深入研究提供的源码,你可以更全面地了解其实现细节,提升自己的编程技能。

    cmb-china-2

    4. **CaseStudy** - 这个文件夹可能包含了一些案例研究,用于展示如何使用“cmb-china-2”的不同方面,或者是项目实施的实例。 5. **MSDN** - 微软开发网络(Microsoft Developer Network)的缩写,通常与Windows...

    Python库 | PyFoam-2021.6.tar.gz

    1. **安装**:首先确保系统已经安装了Python和OpenFOAM,然后可以通过pip命令安装PyFoam,或者从GitHub源码编译安装。 2. **配置环境**:配置OpenFOAM的环境变量,使其与PyFoam兼容,这通常涉及到修改系统的PATH...

    U201814655-杨雨鑫1

    在实现这些高级功能时,可能遭遇设计复用、性能优化和实时响应等问题,解决策略包括研究相关文献、应用设计模式或利用EDA工具的高级特性。 以上是对实验报告的概览,每个任务都涵盖了Verilog HDL的学习和应用,通过...

    c++ study

    每个主题都可以深入研究,结合实际编程练习和阅读源码,能更有效地提升C++编程能力。对于`.idom`和`.doc`文件,可以根据其内容进一步细化学习计划,例如深入研究特定的C++概念或解决问题的策略。

Global site tag (gtag.js) - Google Analytics