不一致同步及静态变量延迟初始化的错误
Posted On 2013年11月26日
INCONSISTENT_SYNC 和 LAZY_INIT_UPDATE_STATIC如何修复?
关于这2个问题,我的一些经验,供参考。findbugs有时候会误报,我们需要确定我们的代码不在多线程环境下使用时。
1. 不一致的同步
1) 例如:
public class test {
int count;
public void countUp() {
count++;
}
public synchronized int getCount() {
return count;
}
}
=========因为read有sync,所以认为count是需要同步为保证计数准确性,所以会认为write的操作也需要加上同步锁======
2)例子2
public class Foo {
private ArrayList names;
public void scan() {
if (names == null) {
synchronized (this) {
this.names = new ArrayList();
}
}
}
}
写的操作时加了sync,但是read时没有。 多线程情况下可能会造成names new了2次。
应该改为:
public class Foo {
private ArrayList names;
public void scan() {
synchronized (this)
if (names == null) {
this.names = new ArrayList();
}
}
}
}
2. 静态变量的延迟初始化:
Class test{
Pviate static ComboPooledDataSource
dataSource = null ;
private static ComboPooledDataSource getDataSource() {
if (dataSource == null) {
dataSource = new ComboPooledDataSource();
try {
dataSource.setDriverClass(databaseDriver);
dataSource.setJdbcUrl(databaseConnectionString);
dataSource.setUser(databaseUser);
dataSource.setPassword(databasePassword);
}
catch (PropertyVetoException pve) {}
}
return dataSource;
}
}
多线程下可能导致datasource 会初始化多次。
T1 if (datasource == null) 当程序执行到此时,如果未初始化,则这条语句为真。
T2 if (datasource == null) 另外一个线程,也执行到这一步。 也认为是真。
T1 datasource = new Datasource… 初始化
T2 datasource = new Datasource(…); 另外一个线程也初始化,因为datasource是静态变量,T2 这个
覆盖了T1 里的datasource。
需要在在if(datasource==null) 前加上synchronized 。
此篇文章已被阅读2603 次