在工作声纳报告中,我们对Android项目中的一些警告:在Android中进行单例初始化的正确方法?
多线程正确性 - 静电场 的FindBugs不正确的延迟初始化:LI_LAZY_INIT_STATIC
为了纠正这些问题,我被引导到双重检查锁定
http://en.wikipedia.org/wiki/Double_checked_locking_pattern#Usage_in_Java
当我通过Android框架代码看看维基百科条目,我看不出有双重检查锁定用于例如,WebViewData基类只是使getInstance(Context)方法同步:
public static synchronized WebViewDatabase getInstance(Context context) {
if (mInstance == null) {
mInstance = new WebViewDatabase(context);
}
return mInstance;
}
Android中的正确方法是什么?
在此先感谢
好的欢呼声我现在明白了,它只是说同步速度较慢但是正确,但是我不需要关心速度,因为它不像一百万个线程试图访问我的几个singleto ns如此同步会做! –
是的,如果你有'if(someInstanceVariable == null){someInstanceVariable = new XYZ}',你通常会得到那个警告,而没有任何方法来确保它不能被同时初始化。但有很多其他的方式来懒惰地实例化singletons像这样[singleton holder](http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement-a-singleton-pattern-in -java/71683#71683)模式和更多在该线程/维基百科中提到,如果你寻找单身人士 – zapl