在Sonar的工作报告中,我们对Android项目提出了一些警告:
多线程正确性 - 静态字段的延迟初始化不正确 findbugs:LI_LAZY_INIT_STATIC
为了解决这些问题,我被引导到双重检查锁定的维基百科条目
http://en.wikipedia.org/wiki/Double_checked_locking_pattern#Usage_in_Java
当我查看android框架代码时,我没有看到双重检查锁定,例如,WebViewDatabase类只是使其getInstance(Context)方法同步:
public static synchronized WebViewDatabase getInstance(Context context) {
if (mInstance == null) {
mInstance = new WebViewDatabase(context);
}
return mInstance;
}
Android中的正确方法是什么?
提前致谢
答案 0 :(得分: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与桌面Java的同步/单例/双重检查锁定没有任何变化