在工作中的 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;
}
Run Code Online (Sandbox Code Playgroud)
Android 中正确的方法是什么?
提前致谢
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;
}
Run Code Online (Sandbox Code Playgroud)
并且mInstance需要定义volatile
Android 与桌面 Java 的同步/单例/双重检查锁定方面没有变化