jdk中SimpleDateFormat的实例线程不安全
线上服碰到诡异问题,解析一段无参数固定代码生成的时间字符串获得时间戳,不定概率出现解析异常,堆栈如下。
产生的原因,因为SimpleDateFormat每次new的代价比较高,固定new一个后重复使用。一开始并没有对输入字符串进行日志打印,就以为是输入字符串的错误,就难以定位到产生问题的原因。
线上服碰到诡异问题,解析一段无参数固定代码生成的时间字符串获得时间戳,不定概率出现解析异常,堆栈如下。
产生的原因,因为SimpleDateFormat每次new的代价比较高,固定new一个后重复使用。一开始并没有对输入字符串进行日志打印,就以为是输入字符串的错误,就难以定位到产生问题的原因。
一个Java项目,无论怎么替换jar包Jar1,运行中某个类A无法加载到最新的class,一直以替换前的旧版本运行导致报错;而Jar1中新加入的类B可以被正确执行,每次替换jar包都能加载到B最新的class。 阅读更多…
多年没有碰Java Web了,之前也一直在Windows下玩耍。在Linux下跑起Tomcat也折腾了一阵。
看Apache Tomcat官网,已经有Tomcat 8.x(据说支持Oracle Java 7.0标准),7.x和6.x,习惯还是使用6.0.44版本。
暑假在天猫实习,从头开始参与一个项目。项目虽小,五脏俱全,虽然自己实现的是一个十分简单如果完全用自己的环境和习惯写代码不用一天就能完成的任务,结果就是因为搭上了淘宝整个系统和环境,变得十分复杂,而且还要和其他team约定接口联调测试,还要和测试、DBA、前台、PD(产品经理)等打交道。
相比本科的百度上海那时候的实习经历,最大的区别就是那时候完全就用一套开源的简单的东西,能多简单能跑起来就好,几乎没有和百度已有的平台去接通(除了一块不是我负责的登陆系统),打交道的主要就是一位前端,再后来就是一个测试,没有接触太多的人和其他的技术。
突然有这么个想法,就写了段代码测试了下。在单线程下对Java里所有Map的性能测试,包括HashMap、Hashtable、LinkedHashMap、IdentityMap、TreeMap,没有测试WeakHashMap。
数据为<Integer, Integer>,范围在0~1千万,共1百万对数据,由Python的random.randint()自动生成。
测试的性能包括写入(put)、随机读(get)和遍历(foreach语法),也是Map这个数据结构最常用的三个操作。其中写入就是将这1百万对测试数据依次put一遍,随机读就是在上一步写入之后再按顺序get一遍。数据显示最后Map大小都为995012(当然IdentityMap的size是1百万),就是有近5000条重复的key。
阅读更多…
上一篇博文讲了Tomcat的系统架构,今天花了一天时间研究了下coyote的源码,大致对普通IO版本有所了解。被同学提醒后发现,Tomcat6已经支持异步IO了,但默认是普通IO版本,需要在Connector的protocol参数中定义为Http11NioProtocol才开启异步IO模式。
主要的代码,Socket的服务在org.apache.tomcat.util.net.JIoEndpoint类,解析处理HTTP请求在org.apache.coyote.http11包的Http11Protocol类和Http11Processor类,org.apache.catalina.connector.CoyoteAdapter负责连接Connector模块(coyote)和Container模块。
线程池默认用的JIoEndpoint类中的子类WorkerStack,若在server.xml配置使用了Executor,则使用org.apache.catalina.core.StandardThreadExecutor(对ThreadPoolExecutor的一层包装)。并发量高的情况下Executor的效率会高一些。 阅读更多…
在上一篇博文中说到因为电脑风扇坏了2天于是看完了《How tomcat works》译本,不过这本书是针对Tomcat4和5来讲的比较老了,然后再结合Tomcat6.0.26的源代码调试学习了总共一周的时间,算是大致将Tomcat6.0的一部分工作机制(JSP、JMX、安全管理等模块没研究)给搞清楚了。大概是因为平时基于Java的Web程序写的太多,对Tomcat这一块源码研究特别感兴趣,有时候为了想通一个问题兴奋地吃饭睡觉都在一直想,非常有动力并且也有效率,好久没有这种感觉了。
串叔发现的问题,觉得很有意思,已有文章作详细描述,把原文翻译地讲一下。原文:http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html。
Java的HashMap本身就不支持多线程,是线程不安全的,不过代码中有一些机制来阻止多线程中的不安全因素,比如在多线程修改操作中抛出ConcurrentModificationException,但是HashMap忽视了数组扩容时候这一修改操作,从而导致可能在多线程中进行了不安全的操作。 阅读更多…
再来讲讲Play框架中Action的参数绑定,用过的都说好,哈哈。不仅可以将任意字符串值(比如用户名和密码)、日期值(生日)、整数值(第几页、年龄等)直接作为Action方法的参数放入其中自动绑定,还可以对继承自play.db.jpa.JAPBase的Model类进行直接的封装,这对一个具有很多变量的JavaBean来说实在是一件令人惊喜的事情,省略了太多太多重复又难看的代码有木有! 阅读更多…
最近对Play框架兴趣甚浓,对其有兴趣的功能都想一探究竟,先研究了下它的Router机制。概要地说,主要使用routes文件和正则表达式来完成URL到函数的映射,不过这里正则表达式功能比较强可以解析出{id}这样的参数,因此Play使用了第三方jregex包而不是JDK的java.util.regex包来执行正则表达式的工作。 阅读更多…
因本科几个老同学的邀请参与一个项目的开发,用到了这个全新的Java框架,“Play”。名字很有意思,接触的1.2.4版本而不是最近的2.o,上手很快,安装包里有自带的Sample程序。框架的易用程度大大超过了自己的预期,果然随着时代的发展Java框架越来越强大并且越来越人性化,最大程度地方便程序员开发应用。
一直使用也看好Spring MVC,但是Spring的日益臃肿让这个框架的优势在不断流失。列举Play一些非常棒的地方,特别是较之Spring MVC的优势。
Java源码学习的第二个重点块,也是jdk中最有意义最有价值的一块,这里的集合类都是数据结构和算法,上手快学到的东西也多,而且在日常Java代码中出现率仅次于java.lang包。java.util中集合类必须是最重要的一块了,当然其他还有日期日历时区、货币、线程等工具类,不过这些类并没有太大的价值去精读。
阅读更多…
寒假很闲,就打算写代码之余看看JDK源码。别觉得JDK源码是什么很难看不懂的代码,都是Java代码而且以逻辑为主算法很少,觉得体验Class、OOP和API的设计远远比掌握某个Class、API的复杂算法有意义(meaningful)也有意思(interesting)的多。
当然因为精力和时间有限,挑选常用和比较重要的包和类去看一下来的实在一些,然后你就会发现java.*下面其实就真没有多少包和类了,10来个包几百个类吧,这些类中有一半是没有或者基本可忽略代码的Annotation、Interface、Exception、Error等,更别看随便一个什么类的代码就上千行,其中3/4是注释有木有!好了,所以这也算是给自己的一个动力吧。果断地拿java.lang开咬…
实验室的调研项目,负责调研HBase,在用单机模式和本地文件系统测试之后,需要搭建HBase集群来测试,当然就要先搭建起来Hadoop集群。花了一天时间,碰到问题若干,并且都一定程度地坑爹,最后终于顺利跑起,泪流满面。
环境:CentOS、hadoop-0.20.203.0rc1.tar.gz、3台虚拟机构建的集群
来上海百度实习也才没多久,这是第三个礼拜吧,接手的项目相当紧迫,而且作为一个实习生我是main coder,不由地带动了极大的工作积极性。这个一开始认为很简单很明了的“小”项目,没想到让我学到了很多东西,今天就讲讲关于Java编码的那些事儿。