java - 示例 SyncService 中 sSyncAdapterLock 的用途是什么?

标签 java android multithreading concurrency

我能找到的所有示例 SyncService 代码似乎都未完全或不必要地同步。

下面的典型代码在创建单例实例时使用静态锁。

public class SyncService extends Service {
  private static final Object sSyncAdapterLock = new Object();
  private static SyncAdapter sSyncAdapter = null;

  @Override
  public void onCreate() {
    synchronized (sSyncAdapterLock) {
      if (sSyncAdapter == null) {
        sSyncAdapter = new SyncAdapter(getApplicationContext(), false);
      }
    }
  }

  @Override
  public IBinder onBind(Intent intent) {
    return sSyncAdapter.getSyncAdapterBinder();
  }
}

来源:http://developer.android.com/training/sync-adapters/creating-sync-adapter.html

关于这段代码的两个奇怪的事情是:

  1. 为什么甚至需要锁? onCreate() 不是总是在主应用线程上调用吗?

  2. 如果在 onCreate() 中需要一个锁,为什么这个锁不用于访问 onBind() 中的实例? FindBugs 将其标记为 50% 同步。

最佳答案

我有同样的问题,我相信答案是这个示例代码中的同步是错误的。是的 onCreate 总是在主线程上调用,所以那里不需要同步。此外,即使多个线程可以同时调用 onBind,该方法在 onCreate 完成之前不会被调用。因此,在此示例代码中根本不需要任何同步。

关于java - 示例 SyncService 中 sSyncAdapterLock 的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20202072/

相关文章:

java - 是否可以在 Eclipse 中调试已经运行的 Java 程序?

图像加载性能中的 Android Drawable 与 Asset

python - 通过字典将函数传递给 thread.start_new_thread

c++ - Qt 和 QWidget 更新中的 std::thread 安全

Java 客户端与两台服务器一起工作

java - 构建.gradle错误。抱歉,无法在此处输入错误,请查看正文

java - 如何使用jsoup在android中发送POST?

android - 在 Android 中使用 SQLCipher 加密/解密现有数据库

python - Selenium Threads : How to open the same browser in multiple threads? 为每个浏览器使用唯一的代理

java - pdfbox - 签名横向文件错误