不一致同步及静态变量延迟初始化的错误

Life is short , play more!
本文来自lihao's Blog,转载请注明。

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 。


发表评论

电子邮件地址不会被公开。 必填项已用*标注