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

时间:2013-11-25 19:56:48

标签: 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()总是在主app线程上调用?

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

2 个答案:

答案 0 :(得分:0)

onCreate可能(理论上)由Android运行时并行调用SyncService的两个不同实例。锁定确保您确实只创建一个静态SyncAdapter

答案 1 :(得分:0)

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