2012-08-31 48 views
0

在工作声纳报告中,我们对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中的正确方法是什么?

在此先感谢

回答

4

public static synchronized WebViewDatabase getInstance不使用双重检查锁定,因此不会有问题。对于双重检查锁定,如果实例存在,则检查锁定外部,如果情况如此,则跳过锁定。这导致执行速度比始终锁定更快,因为您只需要在开始时锁定一次。

如果它是使用双重检查锁定它看起来像

public static WebViewDatabase getInstance(Context context) { 
    if (mInstance == null) { 
     synchronized (WebViewDatabase.class) { 
      if (mInstance == null) 
       mInstance = new WebViewDatabase(context); 
     } 
    } 
    return mInstance; 
} 

mInstance将需要定义volatile

没有关于变化的同步/单身/双检查锁定为Android VS桌面Java

+0

好的欢呼声我现在明白了,它只是说同步速度较慢但是正确,但是我不需要关心速度,因为它不像一百万个线程试图访问我的几个singleto ns如此同步会做! –

+1

是的,如果你有'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

相关问题