下面是在业务中常见的并发问题,优先用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