不一致同步及静态变量延迟初始化的错误
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 。
此篇文章已被阅读2483 次