下面是在业务中常见的并发问题,优先用findBugs等工具扫描,并清空IDE的黄色报警,否则...

错误的单例

下面的double-lock单例代码是被FindBugs扫出的,改正如下。这里在底层主要是为汇编码加入了lock指令防止指令重排

public class AESUtil{
-   private static AES aes;
+   private static volatile AES  aes;
    static public AES getAES(){
        if(aes == null){
        synchronized(AESUtil.class){
            if(aes == null){
                aes = new AES();
            }
        }
        return aes;
    }

}

其实还有更简单的单例方法,就是在static代码段中构造field的实例化,由于ClassLoader加载class时`<clinit()>`阶段由JVM保证线程安全的,因此可以放心用,比如JDBC各种驱动就是这样初始化的。

错误的DataFormat

这个是在进行报表时出现的,当报表耗时大于定时任务间隔时,两个报表服务就会同时执行。如果`SimpleDateFormat`使用的是同一个,那么它的parse方法可能出现报错。具体原理我没有分享JDK源码,可能是它内部eval的状态机不是线程安全的。

解决方法: 1. 每次new一个 2. 使用ThreadLocal