【问题标题】:What is the purpose of sSyncAdapterLock in sample SyncService?示例 SyncService 中 sSyncAdapterLock 的用途是什么?
【发布时间】:2013-12-10 17:02:55
【问题描述】:

我能找到的所有示例 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% 同步。

【问题讨论】:

  • 嘿,您的问题得到答案了吗?如果是,请发布它

标签: java android multithreading concurrency


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不相信有任何理论可以做到这一点。 onCreate 总是在主应用线程上调用。
    • Service#onCreate 总是在进程主线程中在 startCommand 或 onBind 之前被调用(在进程主线程中也被调用)。如果需要这个锁,那么在onBind中就需要一个对应的锁,但是没有。
    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2016-11-25
    相关资源
    最近更新 更多