2016-07-03 对包装类型变量使用synchronized不当造成的同步不正确

       关于关键字synchronized使用不当,造成未同步或者同步不正确,是开发过程中常见的问题。先引出3个问题:

  1. 同步synchronized的底层实现原理是什么?
  2. 对非常量或者非单例对象上使用synchronized,会有什么效果?
  3. 对包装类型使用synchronized,会有什么效果?


阅读全文

2016-07-02 包装类型在条件运算中的使用不当造成的空指针异常

虽然已有几年开发经验,但是工作中发现,这程序中的坑啊,踩的也真是不亦乐乎,很是惭愧。

即使是最最基础的Java语言本身的特性,也有点儿说不清道不明了。大家都曾努力学习过,都正在努力地工作,为什么一些错误总是一而再再而三的犯呢?我想这不是个人基础的问题,而是没有认真总结与回顾。

所以,即日起,小弟我会把工作上学习中遇到的问题都记录下来,可能有些问题会很白痴,然而不惧贻笑大方方能进步。

阅读全文

2015-11-21 Java代码规范实践手册

  舒适区最早是心理学的一个概念,它与人类的压力有着直接的关系。顾名思义,处于这一区域,你会感到非常舒服,觉察不到任何真正的压力,或者用自我麻痹来勉强应对它们。因此,我们既没有强烈的改变欲望,也不会主动地付出太多的努力,所有的行为,无非是为了保持舒适的感觉和假象而已。

——摘自《逃离舒适区》

  程序员从学会第一行“hello world”开始,就逐渐培养起了自己的开发习惯。这些习惯或许来自于讲台上的讲师、搞笑娱乐平台百度知道、同性交友网github等。阅尽网络上难以保证质量的代码,培养了各种各样的毒瘤习惯,而我们却乐在其中。

  是不是觉得Spark、Flume很高端?TB级数据碉堡了吧?把屈指可数的几个线程玩弄于股掌之中?

  “Talk is cheap. Show me the code.”– Linus Torvalds(http://coolshell.cn/articles/1278.html)

  本人从业多年,却依旧写不好一行代码。决心踏出舒适区,从变量命名开始,重塑编码习惯。本文将从代码规范实践的3个等级(初学乍练,融会贯通,登峰造极),指导开发者如何在项目中引入代码规范。 题外话:引入代码规范,是为了后续能够顺利进行Code Review。有很多优秀博文已经论述了code review的重要性,其中一篇:http://coolshell.cn/articles/11432.html 。

注:

  1. 本文仅适用于使用intelliJ IDEA(14.1.x)开发并使用Maven执行构建的开发者。
  2. 业内认可的规范包括Google规范和Sun规范,本次实践所使用的规范是Sun规范。
  3. Checkstyle是本次实践的核心工具。本次实践将通过插件使用checkstyle。
  4. 本次实践的代码规范检查仅用于基础检查。团队各异的规定,还需事先定制好。余额宝,是yuebao,还是yuEBao,还是balancePackage?
  5. 之后附录里会加入checkstyle的检查内容(没那么快)。

阅读全文

2015-10-23 泛型中<? super T>和<? extends T>的区别

原文链接

  我们会经常发现List<? super T>、Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。

extends

  List<? extends Number> foo3的通配符声明,意味着以下的赋值是合法的:

// Number "extends" Number (in this context)
List<? extends Number> foo3 = new ArrayList<Number>();  
// Integer extends Number
List<? extends Number> foo3 = new ArrayList<Integer>(); 
// Double extends Number
List<? extends Number> foo3 = new ArrayList<Double>();  

阅读全文

2015-10-22 一个Java 8中简单Lambda表达式程序

原文链接 作者: Mohamed Sanaulla

  我尝试过把Lambda表达式融入到我的代码中,下面的代码例子是此次尝试的结果。对于那些完全不知道Lambda表达式的Java程序员,我强烈建议在继续阅读之前,浏览一下这篇文章

  Ok,现在你已经熟悉Lambda表达式了(在阅读过推荐的Lambda入门文章之后),那我们现在开始学习一个我认为很好的Lambda表达式的例子。

  考虑一下这种场景:某些操作在执行之前需要做预处理,执行之后需要做后期处理。待执行的操作会随着行为的不同而变化。预处理会提取出这个操作所需的必要参数,后期处理做一些清理的工作。

  我们来看看如何利用接口与接口的匿名实现类模拟这个场景。

阅读全文